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

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

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

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

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

ListView with id 'myListView' must have a data source that either implements ICollection or can perform data source paging if AllowPaging is 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();

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

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

Это обратное stackoverflow.com/questions/472669/…

John 04.03.2010 18:58
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
17
1
54 282
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Ответ принят как подходящий

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

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

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

myListView.DataSource = (List<Record>) dict.Values.Where(rec => rec.Name == "foo");
@lomaxx : Your first solution does not work. I can't seem to be able to cast the result from the where clause to a List. Это приводит к следующему исключению времени выполнения: Невозможно преобразовать объект типа 'd__01[Record]' to type 'System.Collections.Generic.List1 [Запись] '. Ваше второе решение отлично работает, как и Мэтт Хэмилтонс. Я принял [Мэтт Хэмилтонс] (stackoverflow.co
Christian Hagelid 28.08.2008 10:27

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

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

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

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

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

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

@Keith: I'm using a the Guid key in the dictionary somewhere else in my code so I can get a record by record id. Agree to disagree on the syntax ;)
Christian Hagelid 28.08.2008 16:27

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

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

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