如何重构这些数据结构和数据处理代码,以使用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' });
}