C# 自定义类的C列表。包含()
我有一个自定义类的列表,在添加到该列表之前,我想检查该列表是否具有相同的实例,而不是一个属性-所有属性C# 自定义类的C列表。包含(),c#,C#,我有一个自定义类的列表,在添加到该列表之前,我想检查该列表是否具有相同的实例,而不是一个属性-所有属性 public class Function { public string Name; public string RT; public int ParamCount; public List<string> ParamDT; public Function() { ParamDT = new List<stri
public class Function
{
public string Name;
public string RT;
public int ParamCount;
public List<string> ParamDT;
public Function()
{
ParamDT = new List<string>();
}
}
GetHashCode
public override int GetHashCode()
{
return this.Name.GetHashCode();
}
ParamDT也是一个列表,您还必须单独检查它的项目以正确比较
this.ParamDT.Equals(item.ParamDT);
话虽如此,如果您想要对象的单个实例,列表并不是您应该使用的结构。当您搜索整个列表时,尝试在列表中搜索相等项会产生大量开销。尝试使用基于集合/字典的结构
GetHasCode函数的实现也不正确。它仅基于Name属性,而在同等情况下使用所有属性,这将导致不需要的特性。请阅读n以获得更好的实现。下面是一个简单的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,它是一个不包含重复元素的集合。这将确保并没有为检查列表中的唯一性而编写的代码。链接在这里:请提供Equals/hashcode方法。如果只需要每个类型的一个实例,那么集合不是更好的数据结构吗GetHashCode必须从所有签入Equals的属性或字段中构建一个哈希代码,以与Equals保持一致。如果要将对象添加到哈希集或将其用作字典中的键,这一点很重要。
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;
}
}