Но каждая попытка сделать это в LINQ терпит неудачу. Как это сделать?
Вы не должны. Linq предназначен для запросов , а не для обновления . Поскольку у вашего l oop есть побочные эффекты, foreach
- это прекрасно.
Одна вещь, которую вы могли бы сделать, это сделать join
вместо поиска каждого элемента во втором списке:
foreach (var pairs in
(from item in oracleData
join customer in inOrderToGetBranchCodeInAReallyStupidWay
on item.CustomerAbbreviation equals customer.CustomerAbbreviation
select new {item, customer.BranchCode} ))
{
pairs.item.BranchCode = pairs.BranchCode;
}
вы можете решить, какой из них имеет больше смысла читателю. Вы также можете улучшить производительность другими способами, например, создав Dictionary
, чтобы поиск по коду ветвления был O (`) в вашем списке клиентов.
Кроме того, что в целом быстрее, LINQ или foreach?
Для эквивалентных циклов у Linq будут некоторые издержки из-за создания итераторов, но зависит от того, являются ли эти издержки значительными , зависит на то, что делает oop. Например, добавление 2 мс времени итератора к al oop, которое занимает 500 мс для обработки каждого элемента, не имеет значения. С другой стороны, я видел запросы Linq, которые работают со строкой как набор символов, которые на несколько порядков медленнее, чем собственный доступ к индексатору. Для большинства всего остального Linq будет незначительно медленнее. Вы также можете написать неэффективный foreach
l oop, который намного медленнее, чем функционально эквивалентный запрос Linq (например, al oop, который не прерывается, когда он находит то совпадение, которое он ожидает, против запроса First
, который
Помните, что Linq - это продуктивная запись кода , а не производительность кода.