10 votes

Comment indexer dans un var en LINQ ?

J'essaie de faire fonctionner le bout de code suivant dans LINQPad mais je n'arrive pas à indexer dans une variable. Quelqu'un sait comment indexer dans une variable dans LINQ ?

string[] sa = {"one", "two", "three"};
sa[1].Dump();

var va = sa.Select( (a,i) => new {Line = a, Index = i});
va[1].Dump();
// Cannot apply indexing with [] to an expression of type 'System.Collections.Generic.IEnumerable<AnonymousType#1>'

21voto

Joseph Daigle Points 16429

Comme le dit le commentaire, vous ne pouvez pas appliquer l'indexation avec [] à une expression de type System.Collections.Generic.IEnumerable<T> . L'interface IEnumerable ne supporte que la méthode GetEnumerator() . Cependant, avec LINQ, vous pouvez appeler la méthode d'extension ElementAt(int) .

4voto

Keith Points 46288

Vous ne pouvez pas appliquer un index à une variable à moins qu'il s'agisse d'un type indexable :

//works because under the hood the C# compiler has converted var to string[]
var arrayVar = {"one", "two", "three"};
arrayVar[1].Dump();

//now let's try
var selectVar = arrayVar.Select( (a,i) => new { Line = a });

//or this (I find this syntax easier, but either works)
var selectVar =
    from s in arrayVar 
    select new { Line = s };

Dans ces deux cas selectVar est en fait IEnumerable<'a> - pas un type indexé. Vous pouvez cependant facilement le convertir en un type indexé :

//convert it to a List<'a>
var aList = selectVar.ToList();

//convert it to a 'a[]
var anArray = selectVar.ToArray();

//or even a Dictionary<string,'a>
var aDictionary = selectVar.ToDictionary( x => x.Line );

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