哈希集 - 未添加唯一项

时间:2015-01-20 14:12:49

标签: c# asp.net hashset

我有一个包含以下内容的类:

    HashSet<CookieSetItem> _set = new HashSet<CookieSetItem>();

    public IEnumerable<CookieSetItem> Set
    {
        get { return _set; }
    }

    public void Add(int id)
    {
        id.ThrowDefault("id");

        var item = new CookieSetItem(id);

        if (_set.Add(item))
        {
            // this only happens for the first call
            base.Add();
        }
    }

当我多次调用add方法时,比如使用ID 1,2,3等,只会添加第一项。

显然我很困惑,每次使用唯一元素(ID)创建一个新的CookieSetItem时,为什么不添加它?

为了完整起见,这里是cookie集类:

public sealed class CookieSetItem
{
    readonly DateTime _added;
    readonly int _id;

    public DateTime Added
    {
        get { return _added; }
    }

    public int ID
    {
        get { return _id; }
    }

    public CookieSetItem(int id)
        : this(id, DateTime.Now)
    {
    }

    public CookieSetItem(int id, DateTime added)
    {
        id.ThrowDefault("id");
        added.ThrowDefault("added");

        _id = id;
        _added = added;
    }
}

1 个答案:

答案 0 :(得分:2)

了解它的底部 - 不止一个错误,使整体视图蒙上阴影。

首先我用IEquatable更新了我的类,修复了添加问题。其次,我发现使用字符串版本的hashset更新cookie的最终结果也因为未加密而失败。这是修正原始问题的修正类。

public sealed class DatedSet : IEquatable<DatedSet>
{
    readonly DateTime _added;
    readonly int _id;

    public DateTime Added
    {
        get { return _added; }
    }

    public int ID
    {
        get { return _id; }
    }

    public DatedSet(int id)
        : this(id, DateTime.Now)
    {
    }

    public DatedSet(int id, DateTime added)
    {
        id.ThrowDefault("id");
        added.ThrowDefault("added");

        _id = id;
        _added = added;
    }

    public bool Equals(DatedSet other)
    {
        if (other == null) return false;

        return this.ID == other.ID;
    }

    public override bool Equals(Object obj)
    {
        if (obj == null) return false;

        var ds = obj as DatedSet;

        return ds == null ? false : Equals(ds);
    }

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

感谢您的建议。