欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

c#  Linq distinct不会调用Equals方法详解

程序员文章站 2022-06-03 14:54:27
我有以下课程我使用如下方法将一些数据加载到该类的列表中:问题是distinct()调用似乎没有做到这一点.仍然存在彼此相等的对象.根据这篇文章:这就是你应该如何做出不同的工作,但它似乎并没有在modi...

我有以下课程

我使用如下方法将一些数据加载到该类的列表中:

问题是distinct()调用似乎没有做到这一点.仍然存在彼此相等的对象.

根据这篇文章:

这就是你应该如何做出不同的工作,但它似乎并没有在modinfo对象上调用equals方法.

是什么导致这种情况发生?

示例值:

modinfo[0]: id=2069, md5 =0aaebf5d2937bdf78cb65807c0dc047c

modinfo[1]: id=2208, md5 = 0aaebf5d2937bdf78cb65807c0dc047c

我不关心选择哪个值,因为md5值相同,它们可能是相同的.

您还需要覆盖object.equals,而不仅仅是实现iequatable.

如果你把它添加到你的班级:

它应该工作.

有关详细信息,请参阅此文章:implementing iequatable properly

编辑:好的,这是基于gethashcode的最佳实践的略有不同的实现.

你可以验证它:

what's with those specific numbers in gethashcode?

补充知识:c#中通过distinct方法对list集合进行去重

在c#的list集合对象中,可以使用distinct方法来对list集合元素进行去重,如果list集合内部元素为值类型,则distinct方法根据值类型是否相等来判断去重,如果list集合内部元素为引用类型变量,则是判断相同引用的对象为相同进行list集合元素去重操作。

(1)值类型的list集合对象intlist,内部元素为1,1,2,2,3,4,5等这几个元素。对intlist对象进行去重可使用下列语句:

list intlist= new list() { 1, 1,2,2,3,4,5};

intlist= intlist.distinct().tolist();

经过上述distinct方法去重处理并重新赋值后,intlist集合内部元素为:1,2,3,4,5。

(2)针对引用类型的distinct方法去重,则是判断list集合中的对象引用地址是否一致,不一致的话为不同的两个对象,即使2个对象的每个属性值都一样的情况下。

上述程序语句中,虽然list集合testlist中的第2个元素和第3个元素的属性值完全一样,但这2个元素依旧是不同的对象,因此在调用distinct()方法去重后重新赋值,testlist依旧不变。

以上这篇c# linq distinct不会调用equals方法详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。