Как я могу преобразовать IEnumerable<T> в List<T> на C #?

StackOverflow https://stackoverflow.com/questions/31708

  •  09-06-2019
  •  | 
  •  

Вопрос

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

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

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

Я думал, что это сработает, но на самом деле это приводит к Система.Исключение 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();

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

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

Это было полезно?

Решение

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

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

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

Другие советы

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

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

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

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

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

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

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

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

dict.Values.Where(rec => rec.Name == "foo")
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top