Как вы индексируете в var в LINQ?
Я пытаюсь получить следующий бит кода для работы в LINQPad, но не могу индексировать в var. Кто-нибудь знает, как индексировать в var в 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>'
Ответы
Ответ 1
Как говорится в комментарии, вы не можете применять индексирование с []
к выражению типа System.Collections.Generic.IEnumerable<T>
. Интерфейс IEnumerable поддерживает только метод GetEnumerator()
. Однако с помощью LINQ вы можете вызвать метод расширения ElementAt(int)
.
Ответ 2
Вы не можете применить индекс к var, если это не индексируемый тип:
//works because under the hood the C# compiler has converted var to string[]
var arrayVar = {"one", "two", "three"};
arrayVar[1].Dump();
//now let 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 );