我想通过引用对List<T>
进行排序。为什么?我想比较几个列表,找出给定列表中哪些元素是唯一的。首先以某种规范的方式对它们进行排序然后逐步浏览所有列表似乎是一种很好的方法。这实际上意味着我需要使aa IComparer<T>
为不同的引用返回一个非零整数(并且是一致的)。订单必须具有任何意义,但至少在我完成工作所需的时间内为所有T
提供固定订单。
GetHashCode
可以为64位系统上的两个不同对象返回相同的值,因此这是一种进行比较的方法。
IntPtr
的 AddrOfPinnedObject()
可能有效,因为它的大小正确,但我必须在整个过程中固定对象。
让Dictionary<T, long>
先到先发的long
是我现在要做的,但我想知道是否有更好的选择。哈希查找似乎没必要。
定义ReferenceComparer<T> : IComparer<T>
给我固定排序的最佳方法是什么?
这是字典实现:
public class ReferenceComparer<T> : IComparer<T>
{
private long nextAvailable = 0;
private readonly Dictionary<T, long> objectToLong = new Dictionary<T, long>(new AsObjectEqualityComparer<T>());
public int Compare(T x, T y)
{
long xLong;
if (!objectToLong.TryGetValue(x, out xLong))
{
xLong = nextAvailable;
objectToLong[x] = xLong;
nextAvailable = nextAvailable + 1;
}
long yLong;
if (!objectToLong.TryGetValue(y, out yLong))
{
yLong = nextAvailable;
objectToLong[y] = yLong;
nextAvailable = nextAvailable + 1;
}
return xLong.CompareTo(yLong);
}
}