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(项)
returnfalse
或doesbase.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();
}
}