这似乎是一个菜鸟问题,但我找不到一个具体的答案。
我有这样一门课:
public class Quotes{
public string symbol;
public string extension
}我用的是这个:
HashSet<Quotes> values = new HashSet<Quotes>();但是,我可以多次添加相同的报价对象。例如,我的Quotes对象可能具有等于'A‘的'symbol’和等于'=n‘的'extension’,并且此Quotes对象在HashSet中多次出现(通过调试模式查看哈希集)。我在打电话的时候就想过
values.Add(new Quotes(symb, ext));使用相同的symb和ext,将返回'false‘,并且不会添加元素。我有一种感觉,当HashSet添加一个新对象时,它与比较Quotes对象有关。任何帮助都将不胜感激!
发布于 2012-01-06 02:22:57
我猜您正在创建一个具有相同值的新Quotes。在这种情况下,它们是不相等的。如果它们应该被视为相等,则重写Equals和GetHashCode方法。
public class Quotes{
public string symbol;
public string extension
public override bool Equals(object obj)
{
Quotes q = obj as Quotes;
return q != null && q.symbol == this.symbol && q.extension == this.Extension;
}
public override int GetHashCode()
{
return this.symbol.GetHashCode() ^ this.extension.GetHashCode();
}
}发布于 2012-01-06 02:19:12
我曾想过,当使用相同的符号和ext调用
values.Add(new Quotes(symb, ext));时,会返回'false‘,并且不会添加元素。
事实并非如此。
HashSet将使用GetHashCode和Equals来确定对象的相等性。现在,因为你没有覆盖Quotes中的这些方法,所以将使用默认的System.Object的引用相等。每次你添加一个新的Quote,它都是一个唯一的对象实例,所以HashSet会把它看作一个唯一的对象。
如果您覆盖Object.Equals和Object.GetHashCode,它将按照您的预期工作。
发布于 2012-01-06 02:19:43
HashSets首先根据GetHashCode计算出的散列比较条目。
默认实现根据对象本身返回一个哈希码(每个实例不同)。
只有当散列相同时(对于基于实例的散列来说,这是非常不可能的),Equals方法才会被调用并用于明确地比较两个对象。
你必须选择:
中使用Equals
示例:
public override int GetHashCode()
{
return (this.symbol == null ? 0 : this.symbol.GetHashCode())
^ (this.extension == null ? 0 : this.extension.GetHashCode());
}
public override bool Equals(object obj)
{
if (Object.ReferenceEquals(this, obj))
return true;
Quotes other = obj as Quotes;
if (Object.ReferenceEquals(other, null))
return false;
return String.Equals(obj.symbol, this.symbol)
&& String.Equals(obj.extension, this.extension);
}https://stackoverflow.com/questions/8747577
复制相似问题