我有一个自定义类的列表,在添加到列表中之前,我想检查列表是否具有相同的实例(不是一个属性-全部都是)
public class Function
{
public string Name;
public string RT;
public int ParamCount;
public List<string> ParamDT;
public Function()
{
ParamDT = new List<string>();
}
}
我尝试覆盖Equals()和GetHashCode()
但这没用
等于()
public override bool Equals(object obj)
{
var item = obj as Function;
if (item == null)
{
return false;
}
return this.Name == item.Name && this.RT == item.RT &&
this.ParamCount == item.ParamCount && this.ParamDT.Equals(item.ParamDT);
}
GetHashCode()
public override int GetHashCode()
{
return this.Name.GetHashCode();
}
答案 0 :(得分:1)
ParamDT也是一个列表,您还必须单独检查其项目以进行正确比较。
this.ParamDT.Equals(item.ParamDT);
话虽如此,如果您想要对象的单个实例,则list不是您应该使用的结构。尝试在列表中搜索相等性会产生大量开销,因为您将搜索整个列表。尝试使用基于集合/字典的结构。
您对GetHasCode
函数的实现也不正确。它仅基于Name
属性,而在平等使用所有属性的情况下,这会导致不良特性。请阅读MSDN documentatio n以获得更好的实现。
答案 1 :(得分:0)
下面是一个简单的Equals
和GetHashCode
:
protected bool Equals(Function other)
{
return string.Equals(Name, other.Name) && string.Equals(RT, other.RT) && ParamCount == other.ParamCount && Equals(ParamDT, other.ParamDT);
}
public override bool Equals(object obj)
{
if (ReferenceEquals(null, obj)) return false;
if (ReferenceEquals(this, obj)) return true;
if (obj.GetType() != this.GetType()) return false;
return Equals((Function) obj);
}
public override int GetHashCode()
{
unchecked
{
var hashCode = (Name != null ? Name.GetHashCode() : 0);
hashCode = (hashCode * 397) ^ (RT != null ? RT.GetHashCode() : 0);
hashCode = (hashCode * 397) ^ ParamCount;
hashCode = (hashCode * 397) ^ (ParamDT != null ? ParamDT.GetHashCode() : 0);
return hashCode;
}
}
然后可以使用HashSet,它是一个不包含重复元素的集合。这将确保在List中没有编写用于检查唯一性的代码。链接在这里:https://docs.microsoft.com/en-us/dotnet/api/system.collections.generic.hashset-1?redirectedfrom=MSDN&view=netframework-4.7.2