Как я могу преобразовать IEnumerable<T> в List<T> на C #?
Вопрос
Я использую 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")