首页 / 知识
关于c#:使用IEqualityComparer < T >的推荐最佳实践是什么?
2023-04-16 00:51:00

What's the recommended best practice for using IEqualityComparer
|
1 2 3 4 5 6 | class ProductByIdComparer : GenericEqualityComparer<ShopByProduct> { public ProductByIdComparer() : base((x, y) => x.ProductId == y.ProductId, z => z.ProductId) { } } |
就使用而言,应尽可能利用比较器。例如,您应该声明字典使用不区分大小写的
我做了以下事情,我不确定这是否是现实世界中的最佳实践,但对我来说效果很好。 :)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | public class GenericEqualityComparer< T > : IEqualityComparer< T > { private Func<T, T, Boolean> _comparer; private Func<T, int> _hashCodeEvaluator; public GenericEqualityComparer(Func<T, T, Boolean> comparer) { _comparer = comparer; } public GenericEqualityComparer(Func<T, T, Boolean> comparer, Func<T, int> hashCodeEvaluator) { _comparer = comparer; _hashCodeEvaluator = hashCodeEvaluator; } #region IEqualityComparer< T > Members public bool Equals(T x, T y) { return _comparer(x, y); } public int GetHashCode(T obj) { if(obj == null) { throw new ArgumentNullException("obj"); } if(_hashCodeEvaluator == null) { return 0; } return _hashCodeEvaluator(obj); } #endregion } |
然后,您可以在收藏夹中使用它。
1 2 3 4 | var comparer = new GenericEqualityComparer<ShopByProduct>((x, y) => x.ProductId == y.ProductId); var current = SelectAll().Where(p => p.ShopByGroup == group).ToList(); var toDelete = current.Except(products, comparer); var toAdd = products.Except(current, comparer); |
如果需要支持自定义GetHashCode()功能,请使用替代构造函数提供一个lambda来进行替代计算:
1 2 3 4 | var comparer = new GenericEqualityComparer<ShopByProduct>( (x, y) => { return x.ProductId == y.ProductId; }, (x) => { return x.Product.GetHashCode()} ); |
我希望这有帮助。 =)
请参阅此帖子以了解(更好的)替代方法:将委托包装在IEqualityComparer中
向下滚动到KeyEqualityComparer上的部分,尤其是有关GetHashCode重要性的部分。关于
这是MSDN关于IEqualityComparer(非泛型)所说的:
This interface allows the implementation of customized equality comparison for collections. That is, you can create your own definition of equality, and specify that this definition be used with a collection type that accepts the
IEqualityComparer interface. In the .NET Framework, constructors of theHashtable ,NameValueCollection , andOrderedDictionary collection types accept this interface.This interface supports only equality comparisons. Customization of comparisons for sorting and ordering is provided by the
IComparer interface.
看起来该接口的通用版本执行相同的功能,但用于
关于围绕此接口用于您自己的目的的最佳实践。我会说,最佳实践是在派生或实现具有与上述.NET Framework集合相似的功能的类,并且希望在自己的集合中添加相同功能的类时使用它。这将确保您与.NET框架使用接口的方式保持一致。
换句话说,如果您正在开发自定义集合,并且希望允许您的使用者控制在许多LINQ和与集合相关的方法(例如,排序)中使用的相等性,则支持使用此接口。
该列表大量使用此接口,因此您可以说a.Substract(b)或其他一些不错的函数。
只需记住:如果您的对象没有返回相同的哈希码,则不会调用Equals。
我会说最好的用法是当您需要为某个算法插入不同的相等规则时。排序算法可以接受
最新内容
相关内容
linux命令书籍推荐?
linux命令书籍推荐?,基础,系统,分析,增速,技术,风险投资,网站,网上,最新,中国经济,linux入门书籍推荐推荐书籍:《TheCProgrammingLanguage》这百度linux命令推荐?
百度linux命令推荐?,地址,工作,系统,百度,命令,工具,设备,数据,信息,发行,Linux命令大全1、linux常用命令有pwd命令、cd命令、ls命令、cat命令linux命令行书籍推荐?
linux命令行书籍推荐?,基础,系统,管理,网络,基础知识,技术,网站,环境,电子,项目,如何学习linux1、安装Linux发行版:选择一个适合入门学习的Linu入门的python书籍推荐
入门的python书籍推荐,数据,分析,项目,技术,基础,实战,网络,代码,价值,权威,因为Python语言的简洁、易读以及可扩展性,自python语言诞生至今,已Python有哪些推荐使用的装饰器?
Python有哪些推荐使用的装饰器?,单位,时间,代码,标准,灵活,软件,数据,连续,培训,模块,众所周知,Python语言非常强大,有很多优点。值得一提的是,它Web开发人员推荐的Python框架
Web开发人员推荐的Python框架,系统,公司,灵活,时间,项目,软件,框架,认证,管理,异常,您可以在没有框架的情况下创建出色的应用程序。如果您正Python 中如何实现参数化测试?
Python 中如何实现参数化测试?,密码,数据,测试,业务,情况,预期,培训,系统,参数,方法,之前,我曾转过一个单元测试框架系列的文章,里面介绍了unit如何实现python字符串反转?
如何实现python字符串反转?,培训,字符串,切片,方法,列表,以上,全部,更多,内容,python中字符串反转常用的五种方法:使用字符串切片、使用递归python中如何实现字符串拼接?
python中如何实现字符串拼接?,培训,字符串,加号,逗号,函数,本文,空格,变量,请看,效率,本文主要向大家介绍Python中实现分割的6种方法:1、加号python如何实现换行?
python如何实现换行?,培训,结果,字符,以上,方法,更多,内容,python实现换行的方法:1、使用换行符“\n”实现换行#-*-coding:utf-8-*-A="来Python如何实现excel筛选
Python如何实现excel筛选,数据,培训,表示,缺失,表格,示例,模块,手工,以上,标签,python实现筛选Excel数据可以使用pandas库来实现,具体的使用示python如何实现手动输入文字
python如何实现手动输入文字,培训,表达式,字符串,函数,整数,示例,语法,以上,参数,文字,python中可以使用input()函数接收用户输入的文字。函