我有每个发票上的发票和所有产品的清单。 每张发票可以有相同产品的倍数
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个独特的产品
答案 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
类型适当地实现相等。