如何删除不包含哈希码的结构列表中的重复项

use*_*171 0 c# struct list duplicates

我似乎在删除结构列表中的重复项时遇到了一些问题.

这是结构的一个例子:

struct item 
{
    String name;
    int index;
    String type;
}
Run Code Online (Sandbox Code Playgroud)

我想这样做,以便从列表中删除具有相同名称,索引和类型的项目,并且我想在清除其他方法的重复项后使用相同的列表,我只是不完全确定如何做这个.

dca*_*tro 6

问题是ValueType.GetHashCode只使用struct的第一个字段来计算对象的hashcode,如果其中任何一个字段是引用类型,则忽略其他字段.由于您的两个字段是引用类型(即字符串),因此仅使用第一个字段(即,name).

这意味着new item("a", 1, "b")将返回相同的哈希码new item("a", 99, "cccc").

如果第一字段不能用于计算哈希码(例如,name为空),则将使用第二字段.这意味着new item(null, 1, "aaa")将返回相同的哈希码new item(null, 1, "ccc").

您必须覆盖EqualsGetHashCode使用所有三个字段.使这些不可变也是一种好习惯,因为对象的哈希码不应该变异.

正如Servy所指出的,如果您无法更改源代码,请实现IEqualityComparer并将实现的实例传递给Enumerable.Distinct或传递给HashSet.

请参阅Eric Lippert的GetHashCode指南和规则