取消

实现通用IEqualityComparer比较器

在使用Linq做两个列表的集合运算时(交集、并集、差集),如果不是使用对象比较而是要用部分属性比较,需要用到比较器(如果没有比较器则会直接比较对象引用),但是(垃圾)微软没有提供默认的比较器。


问题

每次比较一个类型都需要对类型实现比较器,有没有可以像写lambda表达式一样直接比较呢

解决

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
namespace System.Collections.Generic
{
    public class GenericCompare<T> : IEqualityComparer<T> where T : class
    {
        private Func<T, T, bool> Expr { get; set; }
        public GenericCompare(Func<T, T, bool> expr)
        {
            this.Expr = expr;
        }
        public bool Equals(T x, T y)
        {
            if (Expr(x, y))
                return true;
            else
                return false;
        }
        public int GetHashCode(T obj)
        {
            return 0;
        }
    }
}

使用方法

1
2
3
4
5
6
7
8
9
10
11
12
13
public class Test
{
    public void T1()
    {
        var ls1 = new List<Student> { new Student { Name="小明"},new Student { Name="小红"} };
        var ls2 = new List<Student> { new Student { Name = "小明" }, new Student { Name = "小钢" } };
        ls1.Except(ls2, new GenericCompare<Student>((x, y) => x.Name == y.Name));
    }
}
public class Student
{
    public string Name { get; set; }
}

本文会经常更新,请阅读原文: https://dashenxian.github.io/post/%E5%AE%9E%E7%8E%B0%E9%80%9A%E7%94%A8IEqualityComparer%E6%AF%94%E8%BE%83%E5%99%A8 ,以避免陈旧错误知识的误导,同时有更好的阅读体验。

知识共享许可协议

本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。欢迎转载、使用、重新发布,但务必保留文章署名 小神仙 (包含链接: https://dashenxian.github.io ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请 与我联系 (125880321@qq.com)

登录 GitHub 账号进行评论