7
votes

Prenez tous les 2e object dans la liste

J'ai un iénumérable et je veux obtenir un nouveau iénumérable contenant chaque nième élément.

Cela peut-il être fait à Linq?


0 commentaires

3 Réponses :


23
votes

Je viens de le comprendre moi-même ...

Le ienumerable .where () La méthode contient une surcharge qui prend l'index de l'élément actuel - juste ce que le médecin a ordonné. < / p> xxx

ceci reviendrait xxx

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: xxx

... retournerait xxx


4 commentaires

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 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} - à moi - signifie {2,4} ( Votre code renvoie {1,3,5} ). 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 :)



8
votes

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);


2 commentaires

Vous pouvez également ignorer le tableau et utiliser énumérable.Range (1,10) .


@Anthony: C'est juste un exemple, destiné à une compréhension immédiate. Je sais que certains développeurs devraient rechercher énumérable.Range .



0
votes

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;
        }
    }
}


4 commentaires

Enveloppez cela dans un en utilisant ! ( iEnumerable hérités Idisposable .)


@Dan: Vous voulez dire Ienumerator. Comment se fait-il que je n'ai jamais réalisé cela auparavant?


Oui, je voulais dire ienumerator . OMS! (Pour une raison quelconque, je sais toujours un quand je veux taper l'autre. Doit être la mémoire musculaire.)


Etrange, Ienumerator hérite de l'isolposable, mais Inumérateur ne le fait pas. Se demander pourquoi.