【问题标题】:Is there a way to consistently sort/order objects by reference in C#?有没有办法在 C# 中通过引用一致地对对象进行排序/排序?
【发布时间】:2018-12-04 06:52:36
【问题描述】:

所以,我有几个object 实例,我想将它们按一致的顺序排列。顺序是什么并不重要,只要我可以在任何一对实例上重复它并获得相同的顺序即可。 (假设唯一的实例。)

有什么方法可以在不依赖实例值的情况下做到这一点? (我知道RuntimeHelpers.GetHashCode 可以为每个实例获得一致的散列,而不必担心它的值,但不保证散列是唯一的。)

基本上,我要求实现IComparer<object>

【问题讨论】:

  • 有什么原因吗?拥有object 实例已经够奇怪了。
  • 简单的解决方案是为每个实例生成并存储您自己的值,尽管如果您要跟踪大量对象,这可能会消耗大量内存。
  • 从技术上讲,我将使用它作为更明确的参考,但由于我正在寻找的内容也应该适用于对象,所以我陈述了不太明确的定义。
  • 如果您需要为您控制其定义的对象的解决方案,您可以将一个静态计数器放入类型中,并让构造函数执行互锁递增并获取最新的计数器并将其存储在对象中.现在可以按照创建对象的顺序对对象实例进行排序。 (当然,计数器需要有足够大的范围以使其永远不会溢出。)
  • 我想答案是“不值得努力”。我首先问的唯一原因是因为更传统的排序涉及一些我希望避免的额外延迟。

标签: c# sorting reference


【解决方案1】:

有什么方法可以在不依赖实例值的情况下做到这一点?

没有。

真的吗?

好吧,你可以创建一个弱引用表将对象映射到 guid,然后你的排序可以在弱引用表中查找对象,获取 guid,然后根据 guid 进行排序。

这很贵,但可行。

它必须是一个弱引用表,否则你基本上会破坏垃圾收集器释放任何被你的方案排序过的对象的能力。

我知道 RuntimeHelpers.GetHashCode 可以为每个实例获取一致的哈希值,而不必担心它的值,但不能保证哈希值是唯一的。

没错。如果您将GetHashCode 用于平衡哈希表以外的其他用途,则几乎可以肯定您做错了什么。不是唯一标识符,也不稳定。

我要求实现IComparer<object>

你将不得不忍受失望。无论引用对象的值如何,对引用对象进行总排序不是 .NET 提供的服务。

【讨论】:

  • 呸,当我开始添加涉及弱引用的评论时,您编辑了它。 (我只是想建议他们的列表,而不是通过 guid,但是......)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-19
  • 2019-11-21
  • 2019-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多