Есть ли способ сделать следующее с помощью LINQ?
foreach (var c in collection)
{
c.PropertyToSet = value;
}
Чтобы уточнить, я хочу перебрать каждый объект в коллекции, а затем обновить свойство каждого объекта.
Мой вариант использования - у меня есть куча комментариев к сообщению в блоге, и я хочу перебрать каждый комментарий к сообщению в блоге и установить дату и время для сообщения в блоге равным +10 часов. Я мог бы сделать это в SQL, но я хочу сохранить это на бизнес-уровне.
Ответы:
Хотя вы можете использовать
ForEach
метод расширения, если вы хотите использовать только фреймворк, вы можете сделатьЭто
ToList
необходимо для того, чтобы оценить выбор сразу из-за ленивой оценки .источник
ObservableCollection
голоса, то может быть полезно изменить элементы на месте, а не создавать новый список.источник
collection.ToList().ForEach(c => { c.Property1ToSet = value1; c.Property2ToSet = value2; });
collection.ToList().ForEach(c => { collection[collection.IndexOf(c)] = new <struct type>() { <propertyToSet> = value, <propertyToRetain> = c.Property2Retain }; });
Я делаю это
источник
All()
метода расширения, что может привести к путанице, когда кто-то еще читает код.List<>
, то этотForEach()
метод - гораздо менее загадочный способ сделать это. эксForEach(c => { c.needsChange = value; })
Я на самом деле нашел метод расширения, который будет делать то, что я хочу красиво
источник
foreach
-loop (по любой причине).foreach
как сам код содержитforeach
циклИспользование:
Я не уверен, злоупотребляет ли это LINQ или нет, но это сработало для меня, когда я хотел обновить определенные элементы в списке для определенного условия.
источник
Для этого не существует встроенного метода расширения. Хотя определение одного довольно просто. Внизу поста я определила метод Iterate. Это можно использовать так
Итерация источника
источник
Хотя вы специально спрашивали о решении LINQ, и этот вопрос довольно старый, я публикую не-LINQ-решение. Это потому, что LINQ (= интегрированный в язык запрос ) предназначен для использования в запросах к коллекциям. Все LINQ-методы не изменяют базовую коллекцию, они просто возвращают новую (или, точнее, итератор в новую коллекцию). Таким образом, что бы вы ни делали, например, с помощью
Select
, не влияло на основную коллекцию, вы просто получаете новую.Конечно, вы можете сделать это с
ForEach
(кстати, не LINQ, а расширениемList<T>
). Но это в любом случае буквально используетforeach
, но с лямбда-выражением. Помимо этого, каждый метод LINQ внутренне выполняет итерацию вашей коллекции, например, с помощьюforeach
илиfor
, однако он просто скрывает ее от клиента. Я не считаю это более читабельным и не обслуживаемым (подумайте о редактировании кода при отладке метода, содержащего лямбда-выражения).Сказав это не следует использовать LINQ для изменения элементов в вашей коллекции. Лучший способ - это решение, которое вы уже предоставили в своем вопросе. С помощью классического цикла вы можете легко перебирать свою коллекцию и обновлять ее элементы. На самом деле все эти решения, на
List.ForEach
которые можно положиться , ничем не отличаются, но с моей точки зрения их гораздо сложнее читать.Поэтому вам не следует использовать LINQ в тех случаях, когда вы хотите обновить элементы вашей коллекции.
источник
for
цикл «под капотом». Я чувствую, что это синтетический сахар - создавать менее многословные способы выполнения простых задач, а не заменять стандартное кодирование.Я попробовал несколько вариантов этого, и я продолжаю возвращаться к решению этого парня.
http://www.hookedonlinq.com/UpdateOperator.ashx
Опять же, это чужое решение. Но я собрал код в небольшую библиотеку и использую его довольно регулярно.
Я собираюсь вставить его код здесь, чтобы исключить вероятность того, что его сайт (блог) прекратит свое существование в какой-то момент в будущем. (Нет ничего хуже, чем увидеть пост с надписью «Вот точный ответ, который вам нужен», «Клик» и «Мертвый URL».)
источник
Action<TSource>
вместо создания дополнительного делегата. Это, возможно, не было доступно на момент написания этого, хотя.where T: struct
Е. Перехватывать его во время компиляции.Нет, LINQ не поддерживает способ массового обновления. Единственный более короткий путь - использовать
ForEach
метод расширения. Почему в IEnumerable нет метода расширения ForEach?источник
Я написал несколько методов расширения, чтобы помочь мне с этим.
Я использую это так:
Для справки проверьте аргумент:
источник
Мои 2 копейки: -
источник
Вы можете использовать LINQ для преобразования вашей коллекции в массив, а затем вызвать Array.ForEach ():
Очевидно, что это не будет работать с коллекциями структур или встроенных типов, таких как целые числа или строки.
источник
Вот метод расширения, который я использую ...
источник
List<T>.ForEach
тоже делает, но только для всехIEnumerable
.Я предполагаю, что вы хотите изменить значения внутри запроса, чтобы вы могли написать для него функцию
Но не уверен, что это то, что ты имеешь в виду.
источник
Вы можете использовать Magiq , инфраструктуру пакетных операций для LINQ.
источник
Предположим, у нас есть данные, как показано ниже,
и если мы хотим изменить список и заменить существующие значения списка на измененные значения, то сначала создайте новый пустой список, затем выполните цикл по списку данных, вызвав модифицирующий метод для каждого элемента списка,
источник