J'ai un iénumérable et je veux obtenir un nouveau iénumérable contenant chaque nième élément. P>
Cela peut-il être fait à Linq? p>
3 Réponses :
Je viens de le comprendre moi-même ...
Le ceci reviendrait p> mise à jour: Afin de couvrir à la fois mon cas d'utilisation et la suggestion de Dan Tao, spécifie également Ce que le premier élément retourné devrait être: p> ... retournerait p> ienumerable
Première fois que j'ai constaté une utilisation vraiment solide pour l'indice dans une collection prédicate, Bravo, je n'aurais pas pensé cela.
Vous pouvez définir une méthode d'extension qui renvoie ceci.where (...) pour rendre cela plus clair dans votre application elle-même.
Je pourrais suggérer d'utiliser IDX + 1 code> pour correspondre à la description de "chaque nième élément"; Au moins pour moi, cela suggère que le premier élément renvoyé devrait être le nième élément. Donc, chaque 2e élément de
{1,2,3,4,5} code> - à moi i> - signifie
{2,4} code> ( Votre code renvoie
{1,3,5} code>). Peut-être que cela est subjectif, cependant.
@Dan Tao: a déjà entendu celui-ci? "Pourquoi un chien et un ingénieur sont-ils pareils? - Ils ont tous deux des yeux intelligents, et ni l'un ni l'autre ne peuvent parler". Mon code fait ce que je veux que ce soit, je n'ai rien échoué à l'expliquer correctement :)
Pour mettre en place suggestion de Cristi :
var upToTen = new[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; var evens = upToTen.Sample(2); var multiplesOfThree = upToTen.Sample(3);
Vous pouvez également ignorer le tableau et utiliser énumérable.Range (1,10) code>.
@Anthony: C'est juste un exemple, destiné à une compréhension immédiate. Je sais que certains développeurs devraient rechercher énumérable.Range code>.
Bien que non linq, vous pouvez également créer une méthode d'extension avec le rendement code>.
public static IEnumerable<T> EverySecondObject<T>(this IEnumerable<T> list)
{
using (var enumerator = list.GetEnumerator())
{
while (true)
{
if (!enumerator.MoveNext())
yield break;
if (enumerator.MoveNext())
yield return enumerator.Current;
else
yield break;
}
}
}
Enveloppez cela dans un en utilisant code>! (
iEnumerable code> hérités
Idisposable code>.)
@Dan: Vous voulez dire Ienumerator. Comment se fait-il que je n'ai jamais réalisé cela auparavant?
Oui, je voulais dire ienumerator code>. OMS! (Pour une raison quelconque, je sais toujours un quand je veux taper l'autre. Doit être la mémoire musculaire.)
Etrange, Ienumerator