Как применить C # LINQ для устранения циклов foreach? - PullRequest
0 голосов
/ 22 марта 2019

Как реструктурировать эти структуры данных и код обработки данных, чтобы использовать LINQ для краткости, ясности и эффективности использования ресурсов (процессор + память)?

public class Account
{
    public string AccountNumber {get; set;}  
}

public class Customer
{
    public List<Account> Accounts {get; set;}  
}

public static void TransformAccount(Account account)
{
    if (account != null && account.AccountNumber != null)
    {
        account.AccountNumber = account.AccountNumber.Trim().TrimStart(new char[] {'0'});
    }
}

public static void TransformCustomer(Customer customer)
{
    if (customer == null || customer.Accounts == null) return;
    foreach (var account in customer.Accounts)
    {
        TransformAccount(account);
    }
}

public static ProcessCustomers(List<Customer> customers)
{
    if (customers != null)
    {
      foreach (var customer in customers)
      {
          TransformCustomer(customer);
      }
    }
}

Ответы [ 2 ]

2 голосов
/ 22 марта 2019

LINQ лучше запрашивать, чем модифицировать данные.Тем не менее, вы можете использовать LINQ для получения элементов учетной записи, которые вы хотите изменить, и вносить изменения в foreach.

var customers = GetCustomers(); // Some method that gets a customer list

var toModify = from customer in customers where customer.Accounts != null
               from account in customer.Accounts where account.AccountNumber != null
               select account;

foreach(var item in toModify)
    item.AccountNumber = item.AccountNumber.Trim().TrimStart(new char[]{'0'});

Это не обязательно будет более эффективным, чем просто использование циклов foreach, ноВы можете найти это более читабельным.Так что, хотя вы можете получить краткость и ясность, я не думаю, что вы также получите производительность (как указано в комментариях).

1 голос
/ 22 марта 2019

Вот способ сделать это в LINQ.

При использовании фиктивного списка из 1000 клиентов с 1000 учетными записями каждый, ваш код с foreach занимал 75 миллисекунд, а этот LINQ занимал 123 миллисекунды, почти вдвое больше времени.

    public static void ProcessCustomersLinq(List<Customer> customers)
    {
        customers?
            .Where(c => c != null && c.Accounts != null)
            .SelectMany(c => c.Accounts.Where(a => a != null))
            .ToList()
            .ForEach(a => TrimAccountNumber(a));
    }

    private static void TrimAccountNumber(Account account)
    {
        account.AccountNumber = account.AccountNumber.Trim().TrimStart(new char[] { '0' });
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...