2013-08-20 6 views
1

Я хочу groupBy, чтобы отобразить некоторые элементы в отчете о печати.Linq GroupBy deep compare

model.OrderItems = model.OrderItems 
    .GroupBy(p => p.Product.Id, (key, values) => 
    { 
     values.FirstOrDefault().Quantity = values.Count(); 
     return values.FirstOrDefault(); 
    }).ToList(); 

Это прекрасно работает. Однако у каждого продукта есть некоторые предпочтения, которые я хочу сравнить.

Так что я хочу groupBy, только если products.Preferences, что является Enumerable<Preference> равными. Предпочтения реализует Equals()

+0

Ровный == SequenceEqual или равно == те же элементы, разные порядка по-прежнему в порядке? – xanatos

+0

Что это значит, что предпочтения «равны»? Указывают ли они на одну и ту же ссылку или занимают одни и те же позиции? И как следует сравнивать элементы в этих списках? Какие типы типов входят в этот список? – Steven

+0

@xanatos Вы уверены, что это SequenceEqual? Заказ не имеет значения. – GorillaApe

ответ

0

В реализации Equals Продукта, проверьте равные предпочтения с помощью этого метода:

public static bool ItemsEquals<T>(this IEnumerable<T> source1, IEnumerable<T> source2) 
{ 
    var counter = new Dictionary<T, int>(); 
    foreach (T item in source1) 
    { 
     if (counter.ContainsKey(item)) 
     { 
      counter[item]++; 
     } 
     else 
     { 
      counter.Add(item, 1); 
     } 
    } 
    foreach (T item in source2) 
    { 
     if (counter.ContainsKey(item)) 
     { 
      counter[item]--; 
      if (counter[item] < 0) 
      { 
       return false; 
      } 
     } 
     else 
     { 
      return false; 
     } 
    } 
    return counter.Values.All(c => c == 0); 
}