自定义类.Contains()的C#列表

时间:2018-12-12 00:28:32

标签: c#

我有一个自定义类的列表,在添加到列表中之前,我想检查列表是否具有相同的实例(不是一个属性-全部都是)

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

2 个答案:

答案 0 :(得分:1)

ParamDT也是一个列表,您还必须单独检查其项目以进行正确比较。

this.ParamDT.Equals(item.ParamDT);

话虽如此,如果您想要对象的单个实例,则list不是您应该使用的结构。尝试在列表中搜索相等性会产生大量开销,因为您将搜索整个列表。尝试使用基于集合/字典的结构。

您对GetHasCode函数的实现也不正确。它仅基于Name属性,而在平等使用所有属性的情况下,这会导致不良特性。请阅读MSDN documentatio n以获得更好的实现。

答案 1 :(得分:0)

下面是一个简单的EqualsGetHashCode

    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