每张发票显示 string/int 组独特产品

Per Invoice show string/int array of unique products

我有一张发票清单以及每张发票上的所有产品。 每张发票可以有多个相同产品

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 个唯一产品

你想要 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 类型适当地实现平等。