10

次のコードをLINQPadで機能させようとしていますが、変数にインデックスを付けることができません。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>'
4

2 に答える 2

21

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

于 2008-09-04T23:51:26.003 に答える
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>はインデックス付きの型ではありません。ただし、簡単に変換できます。

//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 );
于 2008-09-05T14:39:14.040 に答える