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

Je suis un novice LINQ essayant de l’utiliser pour réaliser ce qui suit:

J’ai une liste d’ints: –

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

Maintenant, je veux comparer la sum des trois premiers éléments [plage d’index 0-2] avec les trois derniers [intervalle d’index 3-5] en utilisant LINQ. J’ai essayé les méthodes d’extension LINQ Select et Take ainsi que la méthode SelectMany, mais je n’arrive pas à comprendre comment dire quelque chose

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

J’ai également examiné la méthode d’extension Contains, mais je ne vois pas ce qui m’attend. Aucune suggestion? Merci.

Utilisez Skip puis Take.

 yourEnumerable.Skip(4).Take(3).Select( x=>x ) (from p in intList.Skip(x).Take(n) select p).sum() 

Vous pouvez utiliser GetRange ()

 list.GetRange(index, count); 

Pour les listes plus importantes, 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, ce qui peut être (inutilement) coûteux pour les grandes listes. Une méthode d’extension simple pour y parvenir pourrait être:

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

Pour filtrer par index spécifiques (pas de-à):

 public static class ListExtensions { public static IEnumerable ByIndexes(this IList source, params int[] indexes) { if (indexes == null || indexes.Length == 0) { foreach (var item in source) { yield return item; } } else { foreach (var i in indexes) { if (i >= 0 && i < source.Count) yield return source[i]; } } } } 

Par exemple:

 ssortingng[] list = {"a1", "b2", "c3", "d4", "e5", "f6", "g7", "h8", "i9"}; var filtered = list.ByIndexes(5, 8, 100, 3, 2); // = {"f6", "i9", "d4", "c3"};