2008-08-28 5 views
17

Я использую LINQ для запроса общего словаря, а затем использую результат как источник данных для своего ListView (WebForms).Как я могу конвертировать IEnumerable <T> в список <T> в C#?

упрощенный код:

Dictionary<Guid, Record> dict = GetAllRecords(); 
myListView.DataSource = dict.Values.Where(rec => rec.Name == "foo"); 
myListView.DataBind(); 

Я думал, что будет работать, но на самом деле он бросает System.InvalidOperationException:

ListView с идентификатором '' MyListView должен иметь источник данных, либо реализует ICollection или может выполнять подкачку источника данных, если AllowPaging - true.

Для того, чтобы заставить его работать, я должен был прибегнуть к следующему:

Dictionary<Guid, Record> dict = GetAllRecords(); 
List<Record> searchResults = new List<Record>(); 

var matches = dict.Values.Where(rec => rec.Name == "foo"); 
foreach (Record rec in matches) 
    searchResults.Add(rec); 

myListView.DataSource = searchResults; 
myListView.DataBind(); 

Есть небольшой глюк в первом примере, чтобы заставить его работать?

(не был уверен, что использовать в качестве заголовка вопроса для этого, не стесняйтесь редактировать что-нибудь более подходящее)

+0

Это обратная http://stackoverflow.com/questions/472669/c-freely-convert-between-listt-and-ienumerablet – John 2010-03-04 15:58:09

ответ

29

Попробуйте это:

var matches = dict.Values.Where(rec => rec.Name == "foo").ToList(); 

Имейте в виду, что это будет по сути создавая новый список из первоначальной коллекции Values, и поэтому любые изменения в вашем словаре не будут автоматически отражаться в вашем связанном элементе управления.

1
myListView.DataSource = (List<Record>) dict.Values.Where(rec => rec.Name == "foo"); 
+0

[@lomaxx] (http://stackoverflow.com/ вопросы/31708/how-can-i-convert-ienumerablet-to-listt-in-C# 31712): Ваше первое решение не работает. Кажется, я не могу отдать результат из предложения where в список . Это приводит к следующему исключению среды выполнения: * Невозможно передать объект типа « d__0`1 [Record]» для ввода «System.Collections.Generic.List`1 [Record]». * Ваше второе решение отлично работает и так [Matt Hamiltons] (http://stackoverflow.com/questions/31708/how-can-i-convert-ienumerablet-to-listt-in-c#31710). Я принял [Matt Hamiltons] (http://stackoverflow.co – 2008-08-28 06:27:31

3

Вы также можете попробовать:

var matches = new List<Record>(dict.Values.Where(rec => rec.Name == "foo")); 

В основном общие коллекции очень трудно непосредственно отливать, так что вы на самом деле имеют мало выбора, кроме как создать новый объект.

9

Я предпочитаю использовать новый синтаксис Linq:

myListView.DataSource = (
    from rec in GetAllRecords().Values 
    where rec.Name == "foo" 
    select rec).ToList(); 
myListView.DataBind(); 

Почему вы получаете словарь, когда вы не используете ключ? Вы платите за это накладные расходы.

+0

Upvote для вас. – fuzz 2011-11-21 06:07:09

0

Просто добавляя знания, следующее предложение не восстанавливает никаких данных из db. Просто создайте запрос (для него это тип iqueryable). Для запуска этого запроса вы должны добавить .ToList() или .First() в конце.

dict.Values.Where(rec => rec.Name == "foo") 
Смежные вопросы