执行.Distinct()时,忽略匿名类型字符串或char成员的大小写

时间:2018-07-18 21:45:56

标签: c# linq distinct

假设我有一个这样的匿名对象列表

list = [{name: "bob"},{name: "sarah"},{name: "Bob"}]

然后当我列出list.Distinct()时,我会得到[{name: "bob"},{name: "sarah"},{name: "Bob"}]

有没有办法告诉它忽略字符串类型成员的大小写,而只是让bob或Bob返回 duplicate 项目,所以结果是[{name: "bob"},{name: "sarah"}]

最好的办法是在GroupBy上使用.name.ToLower()来解决它-但这远非理想。

1 个答案:

答案 0 :(得分:0)

Distinct使用类型定义的比较来检测同一对象。这意味着它应该检查它们是否是相同的引用,因为它们是对象。

可以在https://dotnetfiddle.net/h5AoUZ

中进行检查

对于您而言,.NET无法知道您认为bobBob相同的条件。

一个命题给你。一种新的具有函数参数的Distinct方法:

public static IEnumerable<TSource> DistinctBy<TSource, TKey>
    (this IEnumerable<TSource> source, Func<TSource, TKey> keySelector)
{
    HashSet<TKey> seenKeys = new HashSet<TKey>();
    foreach (TSource element in source)
    {
        if (seenKeys.Add(keySelector(element)))
        {
            yield return element;
        }
    }
}

然后打电话

list.DistinctBy(x=>x.name.Lower())