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

作者:程序园 时间:2021-09-03 09:53:13 

我有以下课程


public class ModInfo : IEquatable<ModInfo>
{
public int ID { get; set; }
public string MD5 { get; set; }

public bool Equals(ModInfo other)
{
 return other.MD5.Equals(MD5);
}

public override int GetHashCode()
{
 return MD5.GetHashCode();
}
}

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


public void ReloadEverything() {
var beforeSort = new List<ModInfo>();
// Bunch of loading from local sqlite database.
// not included since it's reload boring to look at
var modinfo = beforeSort.OrderBy(m => m.ID).AsEnumerable().Distinct().ToList();
}

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

根据这篇文章:https://msdn.microsoft.com/en-us/library/vstudio/bb348436%28v=vs.100%29.aspx

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

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

示例值:

modinfo[0]: id=2069, MD5 =0AAEBF5D2937BDF78CB65807C0DC047C

modinfo[1]: id=2208, MD5 = 0AAEBF5D2937BDF78CB65807C0DC047C

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

您还需要覆盖Object.Equals,而不仅仅是实现IEquatable.

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


public override bool Equals(object other)
{
ModInfo mod = other as ModInfo;
if (mod != null)
 return Equals(mod);
return false;
}

它应该工作.

有关详细信息,请参阅此文章:Implementing IEquatable Properly

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


public class ModInfo : IEquatable<ModInfo>
{
public int ID { get; set; }
public string MD5 { get; set; }

public bool Equals(ModInfo other)
{
 if (other == null) return false;
 return (this.MD5.Equals(other.MD5));
}

public override int GetHashCode()
{
 unchecked
 {
  int hash = 13;
  hash = (hash * 7) + MD5.GetHashCode();
  return hash;
 }
}

public override bool Equals(object obj)
{
 ModInfo other = obj as ModInfo;
 if (other != null)
 {
  return Equals(other);
 }
 else
 {
  return false;
 }
}
}

你可以验证它:


ModInfo mod1 = new ModInfo {ID = 1, MD5 = "0AAEBF5D2937BDF78CB65807C0DC047C"};
ModInfo mod2 = new ModInfo {ID = 2, MD5 = "0AAEBF5D2937BDF78CB65807C0DC047C"};

// You should get true here
bool areEqual = mod1.Equals(mod2);

List<ModInfo> mods = new List<ModInfo> {mod1, mod2};

// You should get 1 result here
mods = mods.Distinct().ToList();

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 = new List<ConsoleApplication1.TestModel>();
testList.Add(new TestModel()
{
Index=1,
Name=“Index1”
});
testList.Add(new TestModel()
{
Index = 2,
Name = “Index2”
});
testList.Add(new TestModel()
{
Index = 2,
Name = “Index2”
});
testList = testList.Distinct().ToList();

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

来源:http://www.voidcn.com/article/p-vdvfegie-bwm.html

标签:c#,Linq,distinct,Equals
0
投稿

猜你喜欢

  • C# memcached缓存使用实例代码

    2022-01-15 02:17:11
  • 详解Android更改APP语言模式的实现过程

    2023-05-18 16:56:35
  • 详解Spring Boot 部署jar和war的区别

    2022-10-25 18:48:29
  • java8 stream的多字段排序实现(踩坑)

    2023-10-22 11:06:31
  • Spring深入探索AOP切面编程

    2023-05-27 09:37:16
  • 在android中实现类似uc和墨迹天气的左右拖动效果

    2022-06-18 08:47:50
  • Spring集成Swagger常见错误及解决办法

    2023-07-10 05:01:17
  • 解决maven没有打包xml文件的问题

    2023-11-27 14:51:01
  • 获取Java线程转储的常用方法(推荐)

    2023-05-15 02:30:19
  • Java 回调函数深入理解

    2023-11-01 17:32:04
  • 基于Android实现点击某个按钮让菜单选项从按钮周围指定位置弹出

    2021-09-13 23:03:40
  • C#语法相比其它语言比较独特的地方(二)

    2021-12-20 20:56:03
  • Android实现美团外卖底部导航栏动画

    2022-09-21 20:09:13
  • Android自定义StickinessView粘性滑动效果

    2022-11-22 08:56:20
  • Java代理模式与动态代理之间的关系以及概念

    2022-03-15 18:05:34
  • java解析XML详解

    2023-02-26 09:19:51
  • C语言经典指针笔试题详解

    2021-10-23 12:56:39
  • Android 获得View宽高的几种方式总结

    2021-11-12 05:06:49
  • 淘宝IP地址库采集器c#代码

    2022-01-15 22:42:33
  • Android开发中Intent.Action各种常见的作用汇总

    2022-10-08 10:24:53
  • asp之家 软件编程 m.aspxhome.com