使用lambda函数合并两个列表

4

我有两个列表,我需要合并或创建一个新列表,将第二个列表中的一个值添加到第一个列表中具有相同值的位置

列表1

Order| Material |TotalQuantity |Desc
--------------------------------
    1| M1       | 100          |text here
    2| M3       | 20           |text here
    3| M1       | 30           |text here
    1| M5       | 50           |text here

列表2

Order| Material |QuantitySell
--------------------------------
    1| M1       | 10

结果

Order| Material |TotalQuantity |Desc      |QuantitySell
-------------------------------------------------------
    1| M1       | 100          |text here |10
    2| M3       | 20           |text here |
    3| M1       | 30           |text here |
    1| M5       | 50           |text here |

我有这段代码:

finalList.AddRange(
    list1.Distinct()
    .join(
    list2.Select(x=>x).Distinct(),                    
    l1 => new { material = l1.parte.ToUpper().Trim(), Order= l1.orden.ToUpper().Trim()},
    l2=> new {material = l2.parte.ToUpper().Trim(), Order=l2.Order.ToUpper().Trim()},                    
    (l1,l2) => 
    new ListSell
    {
      TotalQuantity = l1.TotalQuantity ,
      QuantitySell= l2.QuantitySell,
      Desc= l1.Desc,
      Material = l1.Material ,
      Orden = l1.orden
    }
    ).ToList()
    );

----编辑---

我遇到了这个错误

错误 11 'System.Collections.Generic.IEnumerable' 不包含名为 'join' 的定义,也不存在接受类型为 'System.Collections.Generic.IEnumerable' 的第一个参数的扩展方法 'join'(是否漏掉了 using 指令或程序集引用?)

想知道如何将这两个列表组合起来?


你的当前代码有什么问题? - MarcinJuraszek
4个回答

1
这是 lambda 版本。
 var list1 = new List<OrderProduct>()
            {
                new OrderProduct(1, "M1", 100, "Text Here"),
                new OrderProduct(2, "M3", 20, "Text Here"),
                new OrderProduct(3, "M1", 30, "Text Here"),
                new OrderProduct(4, "M5", 50, "Text Here"),
            };
        var list2 = new List<OrderSold>()
            {
                new OrderSold(1, "M1", 10),
            };


 var result = list1.GroupJoin(
                list2,
                product => new { product.Order, product.Material },
                sold => new { sold.Order, sold.Material},
            (p, g) => g
        .Select(c => new ListSell
            {
                Order = p.Order,
                Material = p.Material,
                TotalQuantity = p.TotalQuantity,
                Description = p.Description,
                QuantitySell = c.QuantitySell
            })
        .DefaultIfEmpty(new ListSell
            {
                Order = p.Order,
                Material = p.Material,
                TotalQuantity = p.TotalQuantity,
                Description = p.Description,
                QuantitySell = 0
            }))
        .SelectMany(g => g);
    }

1
您正在在结果选择器(join 方法的最后一个参数)中重复使用 l1 和 l2 引用。
请将其更改为以下内容:
        var query = list1.Join(
            list2,
            l1 => new { l1.Order, l1.Material },
            l2 => new { l2.Order, l2.Material },
            (item1, item2) => new
            {
                TotalQuantity = item1.TotalQty,
                QuantitySell = item2.TotalQty,
                Desc = item1.Desc,
                Material = item1.Material,
                Orden = item1.Order
            });

1

这是“Join”,而不是“join”。它区分大小写。


-1

你需要左外连接:

finalList.AddRange(
    (from l1 in list1
     join l2t in list2 on 
         new { material = l1.parte.ToUpper().Trim(), Order = l1.orden.ToUpper().Trim() }
     equals
         new { material = l2.parte.ToUpper().Trim(), Order = l2.Order.ToUpper().Trim() }
     into list2Joined
     from l2 in list2Joined.DefaultIfEmpty()
     select new  ListSell
     {
         TotalQuantity = l1.TotalQuantity ,
         QuantitySell= l2.QuantitySell,
         Desc= l1.Desc,
         Material = l1.Material ,
         Orden = l1.orden
     }).ToList());

1
它不是lambda - Dave

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接