68 votes

Comment sélectionner des valeurs dans une plage d'index fournie dans une liste à l'aide de LINQ

Je suis une LINQ débutant d'essayer de l'utiliser pour réaliser les opérations suivantes:

J'ai une liste d'entiers:-

Liste intList = new Liste(new int[]{1,2,3,3,2,1});

Maintenant, je veux comparer la somme des trois premiers elements [index de la gamme 0-2] avec les trois derniers [plage d'index 3-5] à l'aide de LINQ. J'ai essayé le LINQ Sélectionner et Prendre les méthodes d'extension ainsi que la SelectMany méthode, mais je ne peux pas comprendre comment dire quelque chose comme

(from p in intList  
where p in  Take contiguous elements of intList from index x to x+n  
select p).sum()

J'ai regardé les Contient extension de la méthode de trop, mais cela ne veut pas voir pour me faire ce que je veux. Toutes les suggestions? Merci.

101voto

Adam Sills Points 8749

Utilisez Passer puis prendre.

 yourEnumerable.Skip(4).Take(3).Select( x=>x )

(from p in intList.Skip(x).Take(n) select p).sum()
 

39voto

onuralp Points 113

Vous pouvez utiliser GetRange ()

 list.GetRange(index, count);
 

18voto

Tao Points 5475

Pour les listes plus volumineuses, une méthode d'extension distincte pourrait être plus appropriée pour les performances. Je sais que ce n'est pas nécessaire pour le cas initial, mais l'implémentation de Linq (to objects) repose sur l'itération de la liste. Cela peut donc être coûteux (inutile) pour les grandes listes. Une méthode d'extension simple pour y parvenir pourrait être:

     public static IEnumerable<TSource> IndexRange<TSource>(
        this IList<TSource> source,
        int fromIndex, 
        int toIndex)
    {
        int currIndex = fromIndex;
        while (currIndex <= toIndex)
        {
            yield return source[currIndex];
            currIndex++;
        }
    }
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X