Как преобразовать 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")