首页 > 解决方案 > 根据元素属性从列表中获取唯一元素

问题描述

如何根据 Property 从列表中获取唯一元素string Name?我试过这个,但它不起作用。Resulting List 已排序和分组,但不会删除重复的元素:

List<ElementType> uniqueTypes = types.OrderBy(g => g.Name)
.GroupBy(g => g.Name).Select(s => s.First()).ToList();

任何帮助,非常感谢。

标签: c#listlinq

解决方案


使用扩展方法的标准定义之一DistinctBy。这是我使用的一对:

public static IEnumerable<T> DistinctBy<T, TKey>(this IEnumerable<T> src, Func<T, TKey> keySelector, IEqualityComparer<TKey> comparer = null) {
    var seenKeys = new HashSet<TKey>(comparer);
    foreach (var e in src)
        if (seenKeys.Add(keySelector(e)))
            yield return e;
}
public static IEnumerable<T> DistinctBy<T, TKey>(this IEnumerable<T> src, Func<T, TKey> keySelector, Func<IGrouping<TKey, T>, T> pickOne, IEqualityComparer<TKey> comparer = null) =>
    src.GroupBy(keySelector).Select(g => pickOne(g));

推荐阅读