(name: string, value: long) ペアをセットに格納しようとしています。
public class NameValuePair
{
public string name;
public long value;
}
public NameValuePairComparer comparer = new NameValuePairComparer();
public HashSet<NameValuePair> nameValueSet = new HashSet<NameValuePair>(comparer);
2 つのペアは、名前または値が等しい場合に等しい - これは、EqualityComparer の Equals メソッドをオーバーライドする NameValuePairComparer で実装されます。
public class NameValuePairComparer : EqualityComparer<NameValuePair>
{
public override bool Equals(NameValuePair x, NameValuePair y)
{
return (x.value == y.value) || (x.name == y.name);
}
問題は次のとおりです: GetHashCode(NameValuePair obj) は、Equals が true を返す 2 つのオブジェクトに対して同じ値を返す必要があるため、指定された NameValuePair に対して、GetHashCode() は value.GetHashCode() または name.GetHashCode() のいずれかを返す必要がありますが、これを行うには両方のペアのどのフィールドが等しいかを知る必要があります。
public override int GetHashCode(NameValuePair obj)
{
/* ??? */
/* // Using unknown reference to x
if (obj.value == x.value) return obj.value.GetHashCode();
else if (obj.name == x.name) return obj.name.GetHashCode();
else return base.GetHashCode(obj);
*/
}
}
しかし、これを知ることはできません。つまり、これらのペアを格納するために HashSet を使用することも、EqualityComparer を使用することもできません。
Q: C# (.net 3.5) でハッシュベースでない set の実装はありますか?
Q: カスタムの equality comparer を使用して一意の NameValuePairs を保存するには、どのような方法がよいでしょうか?