在使用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) 。