2015-09-29 3 views
0

У меня есть список счетов-фактур и всех продуктов на каждом счете-фактуре. Каждый счет-фактура может иметь кратные одного и того же продуктаPer Invoice show string/int массив уникальных продуктов

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 уникальных продуктов

ответ

2

Вы хотите ToLookup здесь - он предназначен именно для этого сценария.

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

Это будет по-прежнему содержат идентификаторы дубликатов продуктов, но вы можете легко сделать их отличными, когда вы за ними:

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 тип реализации равенства соответственно.

+0

Beyond блестящий, большое вам спасибо! –

Смежные вопросы