Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用IEqualityComparer<;T>;确定唯一性_C# - Fatal编程技术网

C# 使用IEqualityComparer<;T>;确定唯一性

C# 使用IEqualityComparer<;T>;确定唯一性,c#,C#,我正在使用哈希集。我希望确保没有重复的值。不过,我现在可以这样做 [Serializable()] public class SafetyObsDS { public int Count { get { return set.Count; } } HashSet<CompResults> set; public SafetyObsDS() { set = new HashSet<CompResu

我正在使用哈希集。我希望确保没有重复的值。不过,我现在可以这样做

[Serializable()]
public class SafetyObsDS
{
    public int Count
    {
        get { return set.Count; }
    }

    HashSet<CompResults> set;

    public SafetyObsDS()
    {
        set = new HashSet<CompResults>(new CompareToComparer());
    }

    public bool Add(CompResults cr)
    {
        set.Remove(cr);
        return set.Add(cr);
    }

    public bool Remove(CompResults cr)
    {
        return set.Remove(cr);
    }

    [Serializable()]
    private class CompareToComparer : IEqualityComparer<CompResults> 
    {
        public CompareToComparer() {}

        public bool Equals(CompResults cr1, CompResults cr2) 
        {
            return (cr1.CompareTo(cr2) == 0);
        }

        public int GetHashCode(CompResults cr)
        {
            return (cr.SectionID);
        }
    }
}

[Serializable()]
public class CompResults : IComparable
{
    public int SectionID { get; set; }

    public ComResults(int sectID)
    {
        SectionID = sectID;
    }

    public int CompareTo(object obj)
    {
        return SectionID - (obj as CompResults).SectionID;
    }

}
[Serializable()]
公共类安全OBDS
{
公共整数计数
{
获取{return set.Count;}
}
散列集;
公共安全
{
set=newhashset(newcompareTomarer());
}
公共业务添加(综合结果cr)
{
设置。移除(cr);
返回集合。添加(cr);
}
公共布尔删除(压缩结果cr)
{
返回集。删除(cr);
}
[可序列化()]
私有类比较器比较器:IEqualityComparer
{
公共比较器比较器(){}
公共布尔等于(压缩结果cr1,压缩结果cr2)
{
返回值(cr1.CompareTo(cr2)==0);
}
public int GetHashCode(压缩结果cr)
{
返回(cr.SectionID);
}
}
}
[可序列化()]
公共类压缩结果:i可比较
{
public int SectionID{get;set;}
公共通信结果(int sectID)
{
SectionID=SectionID;
}
公共整数比较(对象对象对象)
{
返回SectionID-(obj作为压缩结果)。SectionID;
}
}
我遗漏了构造函数和其他不必要的代码,如其他字段 当我执行以下操作时,我会收到不想要的结果:

Add(new CompResults(1)); Result: true Add(new CompResults(1)); Result: true <--- this is a dup and I don't want it to add Remove(new CompResults(1)); Result: true 增加(新的综合结果(1));结果:正确
增加(新的综合结果(1));结果:true我认为问题在于,在您的
Add()
代码中,您首先删除现有项,然后添加新的(重复的)项。这将总是成功的,因为没有任何重复项,这就是它返回
true
的原因。删除
Remove()
调用,它将自行修复