2014-01-31 82 views
3

我有兩個列表,我需要加入或創建一個新的列表,從第二個列表中添加一個值到列表中具有相同的值第一個列表加入兩個列表與拉姆達

列表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指令或程序集引用?)

想知道如何結合這兩個列表?

+1

有沒有問題? –

+0

你目前的代碼有什麼問題? – MarcinJuraszek

回答

0

你需要左外連接:

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

這裏是拉姆達版本

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

您在resultSelctor重用的L1和L2引用(join方法的最後一個參數)

更改爲:

 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

它是「加入」而不是「加入」。區分大小寫。