2013-09-04 2 views
1
var groupedList = mylist.GroupBy(mytype => mytype.Category).ToList() 

groupedList теперь является IEnumerable<IGrouping<Category, MyType>>удалить дубликаты из каждой группы после .GroupBy()

Теперь я хотел бы сделать Distinct() на определенном свойстве MyType для каждого IGrouping<Category, MyType> удалить дубликаты. Возвращаемое значение должно быть того же типа, что и groupedList.

ответ

2

Итак, вот решение. Он не идеален с точки зрения производительности, потому что GroupBy в конце немного избыточен, в основном для получения правильных типов, но это не очень дорогостоящая операция, поэтому это должно быть достаточно хорошим.

groupedList = groupedList.SelectMany(group => 
    group.DistinctBy(mytype => mytype.SomeProperty) 
     .Select(item => new 
     { 
      key = group.Key, 
      element = item, 
     })) 
.GroupBy(pair => pair.key, pair => pair.element) 
.ToList(); 

Если вы создаете Group класс, например, так:

public class Group<TKey, TElement> : IGrouping<TKey, TElement> 
{ 
    private IEnumerable<TElement> elements; 

    public Group(TKey key, IEnumerable<TElement> elements) 
    { 
     this.elements = elements; 
     Key = key; 
    } 

    public TKey Key { get; private set; } 

    public IEnumerator<TElement> GetEnumerator() 
    { 
     return elements.GetEnumerator(); 
    } 

    IEnumerator IEnumerable.GetEnumerator() 
    { 
     return GetEnumerator(); 
    } 
} 

public static Group<TKey, TElement> CreateGroup<TKey, TElement>(
    TKey key, IEnumerable<TElement> elements) 
{ 
    return new Group<TKey, TElement>(key, elements); 
} 

Тогда вы можете сделать:

groupedList = groupedList.Select(group => 
    (IGrouping<string, Foo>)CreateGroup(group.Key, 
     group.DistinctBy(mytype => mytype.SomeProperty))) 
    .ToList(); 
+0

Это именно то, что мне нужно, спасибо. Я не обрабатываю много данных, поэтому производительность не должна быть проблемой. – user1151923

0

Существует перегрузка Distinct, которая принимает экземпляр IEqualityComparer<T>.

Создайте класс, который реализует этот интерфейс, где T - mytype.GetType(). Реализация должна провести сравнение с использованием значения вашего свойства.

+0

Там больше к проблеме, чем только что – Servy

+0

у меня уже есть .DistinctBy(), который может это сделать. Проблема заключается в группировке. – user1151923

+0

@ user1151923 Что вы подразумеваете под «проблемой является группировка», я думаю, вам следует объяснить, как Distinct DistinctBy не возвращает то, что вы ожидали – Alan

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