2008-09-04 15 views
10

LINQPad'de çalışmak için aşağıdaki kodları almaya çalışıyorum ancak bir değişkene endeksleyemiyorum. LINQ'da bir varlığa nasıl indeksleneceğini bilen var mı?LINQ'da bir varlığa nasıl indekslenir?

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

cevap

21

comment türe System.Collections.Generic.IEnumerable<T> birer ifadesi [] ile endeksleme uygulayamaz, söylediği gibi. IEnumerable arabirimi sadece GetEnumerator() yöntemini destekler. Ancak LINQ ile, ElementAt(int) uzantı yöntemini çağırabilirsiniz. - değil endeksli tipi Bu iki durumda selectVar yılında

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

IEnumerable<'a> aslında şudur: bir kesici tipi olmadığı sürece

4

Bir var bir indeks uygulayamazsınız. Bunu kolayca birer birer dönüştürebilirsiniz:

//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); 
İlgili konular