2015-09-23 58 views
0

大家好,今天我混淆了试图加入两个列表使用ArticleId和CellarId作为标志,如果两个标志匹配,然后减去并显示结果。这是我的代码:Linq加入两个列表<T>使用多个标志

文章类别:

public class Articles 
{ 
    public Int32 ArticleId { get; set; } 
    public Int32 CellarId { get; set; } 
    public Double ArticleQuantity { get; set; } 
} 

阵列数据并显示结果:

List<Articles> arr1 = new List<Articles>(); 
arr1.Add(new Articles { ArticleId = 1, CellarId = 2, ArticleQuantity = 10.50 }); 
arr1.Add(new Articles { ArticleId = 2, CellarId = 2, ArticleQuantity = 5.00 }); 
arr1.Add(new Articles { ArticleId = 5, CellarId = 1, ArticleQuantity = 2.00 }); 
arr1.Add(new Articles { ArticleId = 1, CellarId = 1, ArticleQuantity = 4.00 }); 

List<Articles> arr2 = new List<Articles>(); 
arr2.Add(new Articles { ArticleId = 5, CellarId = 2, ArticleQuantity = 1.00 }); 
arr2.Add(new Articles { ArticleId = 3, CellarId = 2, ArticleQuantity = 0.50 }); 
arr2.Add(new Articles { ArticleId = 1, CellarId = 1, ArticleQuantity = 5.00 }); 

foreach (var a in GetArrayDifferences3D(arr1, arr2)) 
{ 
    Console.WriteLine("ArticleId: {0}, CellarId: {1}, Qty: {2}", 
     a.ArticleId, a.CellarId, a.ArticleQuantity); 
} 

加入使用LINQ功能:

public static List<Articles> GetArrayDifferences3D(
    List<Articles> Array1, 
    List<Articles> Array2) 
{ 
    List<Articles> ArrayDifferences = new List<Articles>(); 
    ArrayDifferences = Array1.Concat(Array2) 
          .GroupBy(g => new { g.ArticleId, g.CellarId }) 
          .Select(s => new Articles 
          { 
           ArticleId = s.Select(articles => articles.ArticleId).First(), 
           CellarId = s.Select(cellars => cellars.CellarId).First(), 
           ArticleQuantity = (s.Select(a => a.ArticleQuantity).Sum()) 
          }).ToList(); 
    return ArrayDifferences; 
} 

我需要返回这个结果:

ArticleId: 1, CellarId: 2, Qty: -10.50 
ArticleId: 2, CellarId: 2, Qty: -5.00 
ArticleId: 5, CellarId: 1, Qty: -2.00 
ArticleId: 1, CellarId: 1, Qty: 1.00 
ArticleId: 5, CellarId: 2, Qty: 1.00 
ArticleId: 3, CellarId: 2, Qty: 0.50 

我目前的结果是:

ArticleId: 1, CellarId: 2, Qty: 10.5 
ArticleId: 2, CellarId: 2, Qty: 5 
ArticleId: 5, CellarId: 1, Qty: 2 
ArticleId: 1, CellarId: 1, Qty: 9 
ArticleId: 5, CellarId: 2, Qty: 1 
ArticleId: 3, CellarId: 2, Qty: 0.5 

任何帮助表示赞赏,感谢

+1

Array1中的多个数量在你的linq前为-1 ... – Eser

回答

1

你的代码目前正在写的,你需要在ARR1 ArticleQuantity是消极而不是积极的总和的方式()给你预期的结果。我想这个数组代表已售出的数量,从手头的数量中减去。

一个简单的解决方案是创建ARR1的新版本:

var arr1Negative = arr1.Select(a => 
    new Articles() 
    { 
     ArticleId = a.ArticleId, 
     CellarId = a.CellarId, 
     ArticleQuantity = -a.ArticleQuantity 
    }); 

和使用,在地方ARR1的。

您也可以将类似的逻辑移入GetArrayDifferences3D()。

+0

是的,你说得对,简单而高效,谢谢 –