使用IEnumerable初始化的HashSet包含重复元素

时间:2018-04-27 13:24:06

标签: c# hashset

我希望能够使用从HashSet自定义对象集合构建的IEnumerable而不重复。我的自定义对象包含id以及其他一些对此问题不重要的属性。我查询了一个数据库,该数据库返回IEnumerable,我稍后用它来构造HashSet,代码如下:

HashSet<Question> results = new HashSet<Question>(new QuestionComparer());
var result = await query.ExecuteNextAsync<Question>();
results.UnionWith(result);

问题是我不想要的result集合中有重复的记录。 QuestionComparer类看起来像这样:

public class QuestionComparer : IEqualityComparer<Question>
{
    public bool Equals(Question x, Question y)
    {
        return x != null && y != null && x.Id == y.Id;
    }

    public int GetHashCode(Question obj)
    {
        return obj.Id.GetHashCode();
    }
}

我还尝试覆盖Equals类中的GetHashCodeQuestion方法,但没有成功。我考虑循环整个集合并删除重复项,但似乎它可能会成为一个性能问题...

编辑:我正在使用的Azure DocumentDB显然目前不支持&#34; distinct&#34;查询类型。

1 个答案:

答案 0 :(得分:-1)

您应该覆盖现有public class QuestionComparer

的方法,而不是编写Question
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" });

https://dotnetfiddle.net/wrFTaA