每个发票显示独特产品的字符串/ int数组

时间:2015-09-29 12:56:05

标签: c# linq unique linq-group

我有每个发票上的发票和所有产品的清单。 每张发票可以有相同产品的倍数

class InvoiceProducts 
{
    public int InvoiceID { get; set; }
    public int ProductID { get; set; }
}


var list = new List<InvoiceProducts>();
list.Add(new { InvoiceID = 7000, ProductID=15});
list.Add(new { InvoiceID = 7000, ProductID=10});
list.Add(new { InvoiceID = 7000, ProductID=10});
list.Add(new { InvoiceID = 7000, ProductID=15});

list.Add(new { InvoiceID = 7010, ProductID=12});
list.Add(new { InvoiceID = 7010, ProductID=20});
list.Add(new { InvoiceID = 7010, ProductID=12});

list.Add(new { InvoiceID = 7021, ProductID=1});
list.Add(new { InvoiceID = 7021, ProductID=1});

我可以请求帮助 按InvoiceID分组,并具有唯一产品的(排序)整数列表 每张发票 (排序的原因是我需要将其与其他发票与之后的相同产品相匹配)

InvoiceID   ProductID
7000        10,15       
7010        12,20
7021        1

尝试失败:

  var tl2 = List
      .GroupBy(x => x.InvoiceID)
      .ToDictionary(y => y.Key, y => y.Distinct().ToList());

失败尝试解释:它有一个字典按InvoiceID正确分组,但发票7000有4个订单项而不是2个独特的产品

1 个答案:

答案 0 :(得分:2)

你想在这里ToLookup - 它正是为这种情况而设计的。

var lookup = list.ToLookup(x => x.InvoiceID, x => x.ProductID);

它仍会包含重复的产品ID,但您可以在获取它们时轻松区分它们:

var products = list[7000].Distinct();

或者您可以在列表中使用Distinct()

var lookup = list.Distinct()
                 .ToLookup(x => x.InvoiceID, x => x.ProductID);

这适用于使用匿名类型的代码,但如果您实际使用InvoiceProducts类型,不适用。你总是可以预测:

var lookup = list.Select(x => new { x.InvoiceID, x.ProductID })
                 .Distinct()
                 .ToLookup(x => x.InvoiceID, x => x.ProductID);

...或者只是让你的InvoiceProducts类型适当地实现相等。