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