Используйте LINQ вместо foreach - PullRequest
0 голосов
/ 01 апреля 2020

У меня есть список C# с данными для клиентов. Мне нужно поле BranchCode для каждого клиента из другого источника данных, который я ищу и сохраняю во втором списке. Уникальный ключ для клиента - это сокращение клиента, которое есть в каждом списке. Как найти каждого клиента во втором списке, найти его BranchCode и обновить (или создать новый список) первый список с помощью LINQ?

Я могу сделать это следующим образом:

foreach (var item in oracleData)
{
    var oracleDataWithBranchCodeCustomer = 
        inOrderToGetBranchCodeInAReallyStupidWay.Find(customer => customer.CustomerAbbreviation == item.CustomerAbbreviation);

    if (oracleDataWithBranchCode != null)
       item.BranchCode = oracleDataWithBranchCodeCustomer.BranchCode;
}

Но каждая попытка сделать это в LINQ терпит неудачу. Как это сделать? Кроме того, что в целом быстрее, LINQ или foreach?

1 Ответ

3 голосов
/ 01 апреля 2020

Но каждая попытка сделать это в 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 - это продуктивная запись кода , а не производительность кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...