c#基于键将列表与另一个列表合并
我的主要目标是客户名单。由于获取数据的方式,我有两个列表需要合并,如下所示。余额列表包括所有客户的余额。基本上,我想将与特定客户关联的余额添加到客户列表中。我正试图使用Linq根据它们的公共键CustomerNumber来合并这两个,但未能使其正常工作c#基于键将列表与另一个列表合并,c#,linq,list,merge,C#,Linq,List,Merge,我的主要目标是客户名单。由于获取数据的方式,我有两个列表需要合并,如下所示。余额列表包括所有客户的余额。基本上,我想将与特定客户关联的余额添加到客户列表中。我正试图使用Linq根据它们的公共键CustomerNumber来合并这两个,但未能使其正常工作 List<Customer> customers List<Balance> balances public class Customer { int CustomerNumber {get;set;}
List<Customer> customers
List<Balance> balances
public class Customer
{
int CustomerNumber {get;set;}
List<Balance> Balances{get;set;}
}
public class Balance
{
int CustomerNumber {get;set;}
decimal Amount {get;set;}
}
更新:以下是我最终使用的内容
var merge2 = customers.GroupJoin(balances,
c => c.CustomerNumber,
b => b.CustomerNumber,
(c, b) =>
{
c.Balances = b.ToList()
return c;
});
试试这个:
foreach (var customer in customers)
{
var matchingBalances = balances.Where(x => x.CustomerNumber == customer.CustomerNumber);
customer.Balances.AddRange(matchingBalances);
}
试试
GroupJoin
这将合计金额
var merge = customers.GroupJoin(balances,
c => c.CustomerNumber,
b => b.CustomerNumber,
(c, b) => new
{
custname = c.CustomerNumber,
custamount = b.Sum(b2 => b2.Amount)
});
foreach (var cust in merge)
{
Console.WriteLine("{0}: {1}", cust.custname, cust.custamount);
}
下面将列出它们
var merge2 = customers.GroupJoin(balances,
c => c.CustomerNumber,
b => b.CustomerNumber,
(c, b) => new
{
custname = c.CustomerNumber,
custamount = b.ToList()
});
foreach (var cust in merge2)
{
Console.WriteLine("Customer {0} has following amounts: ",
cust.custname);
foreach (var amount in cust.custamount)
{
Console.WriteLine(amount.Amount);
}
}
此图显示了输出
这听起来像是一个连接-那么你尝试了什么-你期望结果是什么?我看到你在@KevinOwens的回答中评论说你正在使用这个解决方案,我认为这是一个很好的处理方法。如果您希望优化现有功能,您应该列出您已经在使用的功能,以及您希望优化的具体方式、更快的处理速度、更低的内存占用等。感谢您的提示。我的下一个帖子会更好!我在下面也发布了一个
GroupJoin
解决方案,这可能也会有所帮助。在LINQ中产生副作用是一种不好的做法。这就是我目前正在做的,我正在寻找一种更有效的方法来链接这两者。你走在正确的轨道上,但这并没有产生预期的结果。我最终使用了这个和Toons33解决方案的组合。我会更新OP.@mmeyer这就是我在这里发布的内容?
foreach (var customer in customers)
{
var matchingBalances = balances.Where(x => x.CustomerNumber == customer.CustomerNumber);
customer.Balances.AddRange(matchingBalances);
}
var combined = from c in customers
join b in balance on b.CustomerNumber equal c.CustomerNumber
select new{
Amount = b.Amount,
Balance = c.Balance,
};
var merge = customers.GroupJoin(balances,
c => c.CustomerNumber,
b => b.CustomerNumber,
(c, b) => new
{
custname = c.CustomerNumber,
custamount = b.Sum(b2 => b2.Amount)
});
foreach (var cust in merge)
{
Console.WriteLine("{0}: {1}", cust.custname, cust.custamount);
}
var merge2 = customers.GroupJoin(balances,
c => c.CustomerNumber,
b => b.CustomerNumber,
(c, b) => new
{
custname = c.CustomerNumber,
custamount = b.ToList()
});
foreach (var cust in merge2)
{
Console.WriteLine("Customer {0} has following amounts: ",
cust.custname);
foreach (var amount in cust.custamount)
{
Console.WriteLine(amount.Amount);
}
}