按引用而不是值排序.NET对象

按引用而不是值排序.NET对象,.net,comparison,reference,.net,Comparison,Reference,如何通过引用对.NET对象进行排序(比较)?我将使用它来有效地确定两个.NET集合是否包含相同的实例(通过引用,而不是值) 这个问题的另一种表述方式可能是要求实现IComparer,它使用引用比较而不是值比较 注意:在Java中,我会使用System.identityHashCode()使用 请注意,使用==运算符进行比较也可以实现您想要的功能,除非在这些类型中重写了相等运算符 编辑:System.Object具有,其工作方式与Java的hashCode()相同。它的行为可能非常类似于ident

如何通过引用对.NET对象进行排序(比较)?我将使用它来有效地确定两个.NET集合是否包含相同的实例(通过引用,而不是值)

这个问题的另一种表述方式可能是要求实现
IComparer
,它使用引用比较而不是值比较

注意:在Java中,我会使用
System.identityHashCode()

使用

请注意,使用
==
运算符进行比较也可以实现您想要的功能,除非在这些类型中重写了相等运算符

编辑:
System.Object
具有,其工作方式与Java的
hashCode()
相同。它的行为可能非常类似于
identityHashCode()
,以满足您的需要,但我无法理解比较引用或哈希代码如何代表对象的实际值。

使用

请注意,使用
==
运算符进行比较也可以实现您想要的功能,除非在这些类型中重写了相等运算符


编辑:
System.Object
具有,其工作方式与Java的
hashCode()
相同。它的行为可能与
identityHashCode()
非常相似,以满足您的需要,但我无法理解比较引用或哈希代码如何代表对象的实际值。

不是对您的问题的直接回答,而是使用LINQ解决实际问题的方法:

IEnumerable<Foo> items = new List<Foo>(){ new Foo(), new Foo() };
IEnumerable<Foo> otheritems = items;

bool identical = items.Intersect(otheritems).ToArray().Count() == items.Count();
IEnumerable items=new List(){new Foo(),new Foo()};
IEnumerable otheritems=项目;
bool identine=items.Intersect(otheritems.ToArray().Count()==items.Count();

这是通过比较引用来实现的,除非
Equals
方法在type
Foo
中被重写,而不是直接回答您的问题,而是使用LINQ解决实际问题:

IEnumerable<Foo> items = new List<Foo>(){ new Foo(), new Foo() };
IEnumerable<Foo> otheritems = items;

bool identical = items.Intersect(otheritems).ToArray().Count() == items.Count();
IEnumerable items=new List(){new Foo(),new Foo()};
IEnumerable otheritems=项目;
bool identine=items.Intersect(otheritems.ToArray().Count()==items.Count();

这是通过比较引用来实现的,除非
Equals
方法在type
Foo

中被重写,否则您不能按引用对.NET对象进行逐字排序。。。显然,您甚至不能使用“不安全”代码将引用转换为整数:

unsafe int ReferenceToInt(object o)
{
    // Error: cannot declare a pointer to a managed type.
    fixed (object* ptr = o)
        return (int)ptr;
}
无论如何,这不是一个好主意,因为压缩垃圾收集不仅可以更改每个对象的地址,还可以更改对象之间的相对顺序。即使GC没有改变相对顺序,GC也可以在任何时候运行,这将使得通过引用进行排序非常危险

GetHashCode()
的默认实现返回某种类型的对象ID,您可以改用它。而且,正如Frédéric提到的,您可以使用Object.ReferenceEquals()来确认两个引用是相同的


最后,在大多数情况下,您应该只使用Dictionary、HashSet或LINQ,正如其他人所提到的。

您不能按引用对.NET对象进行逐字排序。。。显然,您甚至不能使用“不安全”代码将引用转换为整数:

unsafe int ReferenceToInt(object o)
{
    // Error: cannot declare a pointer to a managed type.
    fixed (object* ptr = o)
        return (int)ptr;
}
无论如何,这不是一个好主意,因为压缩垃圾收集不仅可以更改每个对象的地址,还可以更改对象之间的相对顺序。即使GC没有改变相对顺序,GC也可以在任何时候运行,这将使得通过引用进行排序非常危险

GetHashCode()
的默认实现返回某种类型的对象ID,您可以改用它。而且,正如Frédéric提到的,您可以使用Object.ReferenceEquals()来确认两个引用是相同的


最后,在大多数情况下,您应该只使用Dictionary、HashSet或LINQ,正如其他人所提到的
.net与Java的等价物是

我想要比较,而不是相等性检查。@pauldoo:你能用一个例子详细说明你想要什么吗?我有两个
ICollection
的实例。我想知道这两个实例是否包含完全相同的对象集(通过引用相等)。这是一个非常不寻常的要求:)
GetHashCode()
应该做到这一点。字典将使用值比较,而不是我想要的引用比较。我想要比较,不等于检查。@pauldoo:你能用一个例子详细说明你想要什么吗?我有两个
ICollection
的实例。我想知道这两个实例是否包含完全相同的对象集(通过引用相等)。这是一个非常不寻常的要求:)
GetHashCode()
应该可以做到这一点。字典将使用值比较,而不是我想要的引用比较。“按引用排序”吗?两个引用只能是“相等”或“不相等”,而不能是“更高/更低”。我希望运行时能够为我提供任意(但固定)的引用顺序。如果我可以用这个比较器对两个集合进行排序,那么我就可以更有效地验证集合是否包含完全相同的对象实例。这不是很有效,它需要O(nlog(n))时间和O(n)存储。查找重复项只需要O(n)个时间和存储。您分析过您的应用程序并确定这是一个性能瓶颈吗?您的意思是,您可以使用哈希表在O(n)“典型”时间内查找重复项吗?两个引用只能是“相等”或“不相等”,而不能是“更高/更低”。我希望运行时能够为我提供任意(但固定)的引用顺序。如果我可以用这个比较器对两个集合进行排序,那么我就可以更有效地验证集合是否包含完全相同的对象实例。这不是很有效,它需要O(nlog(n))时间和O(n)存储。查找重复项只需要O(n)个时间和存储。您是否分析了应用程序并确定这是一个性能瓶颈?您的意思是,您可以使用哈希表在O(n)“典型”时间内查找重复项