Как изменить элемент в коллекции IEnumerable и сохранить его порядок

2

У меня следующая ситуация. У меня есть список предметов, у которых есть "Id". Я должен искать элемент с определенным идентификатором, изменять его значения и поддерживать порядок коллекции. Каким будет лучший способ сделать это?

var collection = <some_linq_query>

collection.Where(i=>i.Id=someId).FirstOrDefault().Property = "bla";

// now collection should be the same but the item updated.
  • 0
    Над чем работает запрос LINQ?
  • 0
    ToDictionary не сохраняет порядок, поэтому вы не хотите его. Вот синтаксис: Словарь <int,?> Result = collection.ToDictionary (x => x.Id);
Теги:
linq

2 ответа

2
Лучший ответ

Вызов функции Where не изменяет исходный запрос LINQ, хранящийся в collection каким-либо образом. Вместо этого он создает новый IEnumerable<T>, где находится подмножество исходного запроса. Подмножество будет иметь тот же относительный порядок, что и исходное множество в collection

Единственный способ, с помощью которого может возникнуть проблема, - это значение collection - это LINQ, где имеет предложение Where или иначе фильтруется, основываясь на значении Property. Если это так, и вы хотите сохранить коллекцию сил порядка в нелазную оцениваемую структуру через .ToList.

collection = collection.ToList();
  • 0
    Спасибо, это помогло! Дополнительные очки, если вы можете опубликовать пример использования свойства для метода ToDictionary (..): D
1

Пока объекты в коллекции изменяемы, ваш код должен работать нормально.

Кстати, FirstOrDefault принимает необязательный параметр фильтра, поэтому вы можете написать collection.FirstOrDefault(i => i.Id == someId).

  • 0
    Я не думаю, что если я добавлю var item = collection.Where (i => i.Id = someId) .FirstOrDefault (); и наведите курсор мыши на него с помощью отладчика, атрибут является старым значением.
  • 0
    Ваша коллекция содержит struct s?
Показать ещё 1 комментарий
Сообщество Overcoder
Наверх
Меню