Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c#基于键将列表与另一个列表合并_C#_Linq_List_Merge - Fatal编程技术网

c#基于键将列表与另一个列表合并

c#基于键将列表与另一个列表合并,c#,linq,list,merge,C#,Linq,List,Merge,我的主要目标是客户名单。由于获取数据的方式,我有两个列表需要合并,如下所示。余额列表包括所有客户的余额。基本上,我想将与特定客户关联的余额添加到客户列表中。我正试图使用Linq根据它们的公共键CustomerNumber来合并这两个,但未能使其正常工作 List<Customer> customers List<Balance> balances public class Customer { int CustomerNumber {get;set;}

我的主要目标是客户名单。由于获取数据的方式,我有两个列表需要合并,如下所示。余额列表包括所有客户的余额。基本上,我想将与特定客户关联的余额添加到客户列表中。我正试图使用Linq根据它们的公共键CustomerNumber来合并这两个,但未能使其正常工作

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