我有以下问题:
我有成对的 ID,例如:
1 3
3 1
1 2
...
然后我想将它存储在某种结构中,这样我就可以简单地检查我是否已经有这个连接:
1 3
已存储,所以当我得到时,3 1
我会看到它1 3
存在并且它会返回存在。然后我得到1 2
并且我将得到不存在,因为1 2
或者2 1
没有被存储。
如何实现这一点,或者什么是一个好的结构?
我有以下问题:
我有成对的 ID,例如:
1 3
3 1
1 2
...
然后我想将它存储在某种结构中,这样我就可以简单地检查我是否已经有这个连接:
1 3
已存储,所以当我得到时,3 1
我会看到它1 3
存在并且它会返回存在。然后我得到1 2
并且我将得到不存在,因为1 2
或者2 1
没有被存储。
如何实现这一点,或者什么是一个好的结构?
听起来你想要这样的东西:
// You could turn this into a struct if you wanted.
public sealed class IdPair : IEquatable<IdPair>
{
private readonly int first;
private readonly int second;
public int First { get { return first; } }
public int Second { get { return second; } }
public IdPair(int first, int second)
{
this.first = first;
this.second = second;
}
public override int GetHashCode()
{
// This is order-neutral.
// Could use multiplication, addition etc instead - the point is
// that {x, y}.GetHashCode() must equal {y, x}.GetHashCode()
return first ^ second;
}
public override bool Equals(object x)
{
return Equals(x as IdPair);
}
public bool Equals(IdPair other)
{
if (other == null)
{
return false;
}
return (first == other.first && second == other.second) ||
(first == other.second && second == other.first);
}
}
那么你只需要一个HashSet<IdPair>
. 感觉这是一种比使用更自然的方法 a Dictionary
,因为您实际上并没有一个键 - 您只有一个两个属性都类似键的对,并且您基本上对顺序中性相等感兴趣对。