C# 使用IEnumerable初始化的哈希集包含重复的元素

C# 使用IEnumerable初始化的哈希集包含重复的元素,c#,hashset,C#,Hashset,我希望能够使用由IEnumerable自定义对象集合构建的HashSet,而无需重复。我的自定义对象包含id和一些其他属性,这些属性对于这个问题并不重要。我对一个数据库进行查询,该数据库返回一个IEnumerable,我稍后使用该数据库用以下代码构造一个HashSet: HashSet<Question> results = new HashSet<Question>(new QuestionComparer()); var result = await query.Ex

我希望能够使用由
IEnumerable
自定义对象集合构建的
HashSet
,而无需重复。我的自定义对象包含
id
和一些其他属性,这些属性对于这个问题并不重要。我对一个数据库进行查询,该数据库返回一个
IEnumerable
,我稍后使用该数据库用以下代码构造一个
HashSet

HashSet<Question> results = new HashSet<Question>(new QuestionComparer());
var result = await query.ExecuteNextAsync<Question>();
results.UnionWith(result);
我还尝试在
Question
类中重写
Equals
GetHashCode
方法,但没有成功。我考虑过在集合中循环并删除重复项,但似乎这可能会成为性能问题


编辑:我正在使用的Azure DocumentDB显然目前不支持“独特”类型的查询。

您应该重写现有
问题
类的方法,而不是编写
公共类问题比较器

public class Question
{
    public string ID { get; set; }

    public override int GetHashCode()
    {
        return ID.GetHashCode();
    }

    public override bool Equals(System.Object obj)
    {
        return (obj != null && obj is Question) ? (this.ID == ((Question)(obj)).ID) : false;
    }
}
所以复制是不可能的。样本:

HashSet<Question> qh = new HashSet<Question>();
qh.Add(new Question() { ID = "1" });
qh.Add(new Question() { ID = "1" }); //will not be added
qh.Add(new Question() { ID = "2" });
HashSet qh=newhashset();
添加(新问题(){ID=“1”});
添加(新问题(){ID=“1”})//不会被添加
添加(新问题(){ID=“2”});

什么类型的
Id
?它是
字符串
请提供使用
结果的原因。UnionWith(结果)newhashset(result,newquestioncomparer())
。结果应该是一样的,但我找到了你的方法confusing@Luki:您是否使用调试器检查了
GetHashCode
Equals
中使用重复的
id
时发生的情况(您可以创建一个条件断点).我现在又试了一次,似乎我以前犯过一些愚蠢的错误,因为它现在运行得非常好。。。我真的不知道以前出了什么问题。因为你是第一个接受这个答案。
HashSet<Question> qh = new HashSet<Question>();
qh.Add(new Question() { ID = "1" });
qh.Add(new Question() { ID = "1" }); //will not be added
qh.Add(new Question() { ID = "2" });