.GroupBy()之后从每个组中删除重复项

时间:2013-09-04 14:10:47

标签: c# linq

var groupedList = mylist.GroupBy(mytype => mytype.Category).ToList()

groupedList现在是IEnumerable<IGrouping<Category, MyType>>

现在,我想对每个IGrouping<Category, MyType>的MyType的特定属性执行Distinct()以删除重复项。返回值必须与groupedList的类型相同。

2 个答案:

答案 0 :(得分: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();

答案 1 :(得分:0)

Distinct的重载需要IEqualityComparer<T>的实例。

创建一个实现该接口的类,其中T是mytype.GetType()。实现应该使用您的属性值进行比较。