Je travaille sur certains C # Code traitant de problèmes tels que des moyennes mobiles, où j'ai souvent besoin de prendre une liste / iEnumerable et de travailler sur des morceaux de données consécutives. Le module F # SEQ a une excellente fonction, vitrée, qui prend une séquence, retourne une séquence de morceaux d'éléments consécutifs. p>
Est-ce que c # a une fonction équivalente en dehors de la boîte avec LINQ? P>
4 Réponses :
Vous pouvez toujours simplement appeler seqmodule.Windowed code> de C #, il vous suffit de référencer fshaarp.core.dll code>. Les noms de fonction sont également légèrement mangés, vous appelez donc fenêtré code> plutôt que fenêtré code>, de sorte qu'il convient aux conventions C # Capitalization P>
Ici, ici, ça fait ça tout le temps! SEQ.SINGLETON, FSHARPSET, vous le nommez. Quand je dois coder en C #, je viens souvent à l'aide du F # stdlib. Comment pourrais-je vivre sans ça!
C'est seqmodule.Windowed code> en fait.
J'aime trouver une réponse ici que j'ai déjà prélevé et édité, mais j'ai complètement oublié.
Vous pouvez toujours rouler votre propre (ou traduire celui de F # noyau):
public static IEnumerable<T[]> Windowed<T>(this IEnumerable<T> list, int windowSize)
{
//Checks elided
var arr = new T[windowSize];
int r = windowSize - 1, i = 0;
using(var e = list.GetEnumerator())
{
while(e.MoveNext())
{
arr[i] = e.Current;
i = (i + 1) % windowSize;
if(r == 0)
yield return ArrayInit<T>(windowSize, j => arr[(i + j) % windowSize]);
else
r = r - 1;
}
}
}
public static T[] ArrayInit<T>(int size, Func<int, T> func)
{
var output = new T[size];
for(var i = 0; i < size; i++) output[i] = func(i);
return output;
}
Remplacez l'appel à arrayinit code> avec var barr = nouveau t [Windowsize]; pour (int j = 0; j r = r - 1 code> avec r - code> et - dans mes tests de toute façon - il était légèrement plus rapide que SEQ.Windowed < / code>.
SEQ.Windowed Code> Utilise Zerocreeeunchecked code>, mais il ignore simplement la validation du paramètre code> Taille code> (c.-à-d. si la taille <0 Invalidarg .. . code>). Cela n'évite pas la vérification des limites. Cela fait à la discrétion de la jière, je crois.
@Daniel, ravi de voir quelqu'un a pris l'appât :) Je ne peux pas avoir vos résultats cependant. Si je fais var list = énumérable.Range (0, 100000); var sw = stopwatch.startnew (); int compte = liste.Windowed (15) .Count (); sw.stop (); code> et ensuite la même chose avec microsoft.fsharp.collections.seqmodule.windowed code> (sur une nouvelle plage), le C # prend toujours environ deux fois plus long ...
Exécutez-vous le C # dans le débogueur? Exécutez les deux versions en mode de sortie.
@Daniel, aurait dû penser à cela! C # toujours plus lent que f # pour moi cependant, mais pas deux fois plus long. Pastebin.com/tvgfffaM
C # et Les versions F # effectuent presque de manière identique sur l'idéone. Le C # est négligablement plus lent, mais l'idéone utilise Mono. Mes tests originaux étaient sous Windows.
Le Extensions réactives Avoir quelques opérateurs pour aider à cela, comme tampon et
La réponse de John Palmer est géniale, voici un exemple basé sur sa réponse.
var numbers = new[] {1, 2, 3, 4, 5};
var windowed = SeqModule.Windowed(2, numbers);
L'utilisateur qui a fourni la réponse acceptée a été admis qu'il était faux, vous voudrez peut-être envisager de choisir un autre maintenant.