如何应用 C# LINQ 来消除 foreach 循环



如何重构这些数据结构和数据处理代码,以使用LINQ实现简洁、清晰和资源效率(CPU + 内存(?

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);
      }
    }
}

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 循环的性能更高,但您可能会发现它更具可读性。因此,虽然您可能会获得简洁明了,但我认为您不会获得性能(如评论中所述(。

下面是在 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' });
    }

最新更新