Как преобразовать IEnumerable <T> в List <T> в С#?

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

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

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

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

ListView с id '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();

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

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

Ответ 1

Попробуйте следующее:

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

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

Ответ 2

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

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

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

Ответ 3

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

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

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

Ответ 4

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

Ответ 5

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

dict.Values.Where(rec => rec.Name == "foo")