Как вы индексируете в var в LINQ? - PullRequest
       19

Как вы индексируете в var в LINQ?

10 голосов
/ 05 сентября 2008

Я пытаюсь заставить следующий бит кода работать в 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>'

Ответы [ 2 ]

21 голосов
/ 05 сентября 2008

Как говорится в комментарии, вы не можете применить индексирование с [] к выражению типа System.Collections.Generic.IEnumerable<T>. Интерфейс IEnumerable поддерживает только метод GetEnumerator(). Однако с LINQ вы можете вызвать метод расширения ElementAt(int).

4 голосов
/ 05 сентября 2008

Вы не можете применить индекс к переменной, если это не индексируемый тип:

//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 );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...