2008-09-04 4 views
10

Ich versuche, den folgenden Code in LINQPad zu arbeiten, kann aber nicht in eine Var indexieren. Wer weiß, wie man in LINQ in eine Var indexiert?Wie indizieren Sie in LINQ in eine var?

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>' 

Antwort

21

Wie der Kommentar sagt, kann man nicht die Indizierung mit [] auf einen Ausdruck vom Typ System.Collections.Generic.IEnumerable<T> gilt. Die IEnumerable-Schnittstelle unterstützt nur die Methode GetEnumerator(). Mit LINQ können Sie jedoch die Erweiterungsmethode ElementAt(int) aufrufen.

4

Sie können einen Index auf einen var gelten, wenn es sich um eine Art Wende ist:

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

In diesen beiden Fällen selectVar ist eigentlich IEnumerable<'a> - nicht ein indiziertes Typ. Sie können es jedoch problemlos in eins umwandeln:

//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); 
Verwandte Themen