Как я могу конвертировать IEnumerable <T>в список <T>в C #? - PullRequest
17 голосов
/ 28 августа 2008

Я использую LINQ для запроса универсального словаря, а затем использую результат в качестве источника данных для моего ListView (WebForms).

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

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

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

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

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

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();

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

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

Ответы [ 5 ]

29 голосов
/ 28 августа 2008

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

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

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

9 голосов
/ 28 августа 2008

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

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

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

3 голосов
/ 28 августа 2008

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

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

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

1 голос
/ 28 августа 2008
myListView.DataSource = (List<Record>) dict.Values.Where(rec => rec.Name == "foo");
0 голосов
/ 08 августа 2016

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

dict.Values.Where(rec => rec.Name == "foo")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...