Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/332.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# 哈希集-未添加唯一项_C#_Asp.net_Hashset - Fatal编程技术网

C# 哈希集-未添加唯一项

C# 哈希集-未添加唯一项,c#,asp.net,hashset,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");

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

    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();
        }
    }

追根究底——不止一个错误,给整体视图蒙上了阴影

首先,我用IEquatable更新了我的类,修复了添加问题。其次,我发现最终的结果是用哈希集的字符串版本更新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();
    }
}
公共密封类日期集:IEquatable
{
添加了只读日期时间;
只读int_id;
添加了公共日期时间
{
获取{return\u added;}
}
公共整数ID
{
获取{return\u id;}
}
公共日期集(内部id)
:此(id,DateTime.Now)
{
}
公共日期集(int-id,添加的日期时间)
{
id.ThrowDefault(“id”);
添加。ThrowDefault(“添加”);
_id=id;
_添加=添加;
}
公共布尔等于(日期集其他)
{
if(other==null)返回false;
返回this.ID==other.ID;
}
公共覆盖布尔等于(对象对象对象)
{
if(obj==null)返回false;
var ds=对象作为日期集;
返回ds==null?false:Equals(ds);
}
公共覆盖int GetHashCode()
{
返回ID.GetHashCode();
}
}

感谢您的建议。

您需要在
CookieSetItem
中过度隐藏
GetHashCode
,并返回对象的hashcode(如
ID
属性),或者实现
IEqualityComparer
并将其传递到
HashSet
构造函数中。是否
\u set.Add(项)
return
false
或does
base.Add()
实际上并没有“添加”该项(最好知道
base
是什么,以及
base.Add
做什么)。@DStanley-base.Add()由于哈希集的原因没有被调用。Add returningfalse@SimonBelanger这将如何允许添加实例2、3等?似乎如果未覆盖
Equals
,则可以添加其他实例而不会出现问题。请显示一个简短但完整的程序来演示问题。这里的信息太少,无法帮助您。这是一个很好的实现,因为类是
密封的
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();
    }
}