var groupedList = mylist.GroupBy(mytype => mytype.Category).ToList()
groupedList
现在是IEnumerable<IGrouping<Category, MyType>>
现在,我想对每个IGrouping<Category, MyType>
的MyType的特定属性执行Distinct()以删除重复项。返回值必须与groupedList
的类型相同。
答案 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()。实现应该使用您的属性值进行比较。