2008-09-04 10 views
10

次のコードをLINQPadで動作させようとしていますが、varにインデックスを付けることができません。誰でもLINQのvarにインデックスを付ける方法を知っていますか?LINQで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>' 

答えて

21

コメントが言うように、あなたはタイプSystem.Collections.Generic.IEnumerable<T>の発現に[]とインデックスを適用することはできません。 IEnumerableインターフェイスはメソッドGetEnumerator()のみをサポートします。ただし、LINQでは、拡張メソッドElementAt(int)を呼び出すことができます。

4

それがインデックス可能なタイプでない限り、あなたはVARにインデックスを適用することはできません: - ないインデックス付きタイプの両方これらのケースでは

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

selectVarは実際にIEnumerable<'a>です。あなたは簡単に1に変換することができます:

//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); 
関連する問題