C# HashSet ExceptWith不使用复杂类型

C# HashSet ExceptWith不使用复杂类型,c#,hashset,C#,Hashset,G'day, 我试图找出SQL server上的数据与本地存储的数据之间的差异。我将本地数据和SQL数据存储在两个单独的哈希集中 现在我可以确认两个Hashset之间只有1个差异点,但是当我运行SQLHashSet.ExceptWith(LocalHashSet)时,它会给出完整的Hashset,而不仅仅是一条额外的记录 我正在使用此自定义类型: class Client : IEquatable<Client> { public string ID { get; set;

G'day, 我试图找出SQL server上的数据与本地存储的数据之间的差异。我将本地数据和SQL数据存储在两个单独的哈希集中

现在我可以确认两个Hashset之间只有1个差异点,但是当我运行
SQLHashSet.ExceptWith(LocalHashSet)
时,它会给出完整的Hashset,而不仅仅是一条额外的记录

我正在使用此自定义类型:

class Client : IEquatable<Client>
{
    public string ID { get; set; }
    public override int GetHashCode() 
    {
        return StringComparer.InvariantCulture.GetHashCode(this.ID);
    }
    public override bool Equals(object obj)
    {
        return Equals(obj as Client);
    }

    public bool Equals(Client obj)
    {
        return obj != null && StringComparer.InvariantCulture.Equals(ID, obj.ID);
    }
}
类客户端:IEquatable
{
公共字符串ID{get;set;}
公共覆盖int GetHashCode()
{
返回StringComparer.InvariantCulture.GetHashCode(this.ID);
}
公共覆盖布尔等于(对象对象对象)
{
回报等于(obj作为客户);
}
公共bool等于(客户obj)
{
返回obj!=null&&StringComparer.InvariantCulture.Equals(ID,obj.ID);
}
}

我对ExceptWith如何工作的理解是错误的,还是我需要设计自己的方法来比较列表?

您的代码应该与您实现的
IEquatable
和覆盖
GetHashCode
的方式一致,因此问题很可能实际上与您的数据有关。在将数据加载到
HashSet
之前,您应该确保数据已被修剪,因为
的“SomeValue”
将与
的“SomeValue”

不匹配
您确定
SQLHashSet
本地HashSet
没有不同的值吗?不能修剪吗?运行
SQLHashSet.ExceptWith(LocalHashSet)
后,是否检查
SQLHashSet
LocalHashSet
中的值?在第一次运行时,应用程序会将数据从SQL server复制到本地文件。我手动添加一条记录,然后再次运行该程序。程序检测到还有1条记录,但仍然返回完整的哈希集。我无法用代码重现您的问题:
var SQLHashSet=newhashset{new Client{ID=“Hello”},new Client{ID=“World”};var LocalHashSet=newhashset{newclient{ID=“World”};ExceptWith(LocalHashSet)正确地将SQLHashSet减少为“Hello”条目。请提供一个。啊,你是正确的,当数据再次从SQL server检索时,它没有被修剪,你想把它作为一个答案吗?