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;
        }
    }