【问题标题】:custom sorting of Hashtable in C# (not by keys)C# 中 Hashtable 的自定义排序(不是按键)
【发布时间】:2011-09-22 00:13:07
【问题描述】:

我需要通过添加到集合中的对象的属性对 Hashtable 中的数据进行排序。怎么做?我的项目使用 .NET 2.0,所以我不能使用在 .NET 2.0 运行时默认不起作用的任何功能(我可能能够使用在 .NET 2.0 上工作的一些 C# 3.0 功能,而无需添加对任何新的 dll)。添加到哈希表的所有对象都属于同一类型。如果我使用 SortedList 并将 Hashtable 传递给它(通过构造函数),那么它只按键排序,有没有办法将自定义排序逻辑传递给它?

【问题讨论】:

    标签: c# collections hashtable


    【解决方案1】:

    如果您绑定到 .NET 2.0,您可以使用 IComparer。 http://codebetter.com/davidhayden/2005/02/27/implementing-icomparable-for-sorting-custom-objects/

    如果你想对某些东西进行排序,Hashtable 绝对是错误的数据结构。

    【讨论】:

    • 我知道我可以使用 IComparer,但不知道如何将它传递给 Hashtable。无论如何,我现在已经通过创建一个数组列表来解决它,方法是通过其构造函数传递哈希表的“值”集合并将“IComparer”的实现传递给数组列表的“排序”方法。谢谢。
    【解决方案2】:

    @Snoopy 说 IComparer,这确实是你需要的。看看SortedDictionary

    【讨论】:

      【解决方案3】:

      看一下哈希表的drawbacks。然后查看优势并确定您是否使用了正确的数据结构。如果您很少排序,那么您可能使用了正确的数据结构。在这种情况下,排序将要求您枚举值并将它们放入列表中。如果排序频繁,请考虑转移到不同的数据结构,例如search tree。如果您很少进行查找/搜索,我会考虑使用普通列表。

      【讨论】:

        【解决方案4】:

        如果您想坚持从 Hashtable 的内容创建排序列表,一种选择是编写 IComparer 的子类,根据需要重载 Compare 方法,然后使用以下方法创建排序列表:

        SortedList s = new SortedList( new MyIComparer() );

        然后将 Hashtable 的元素相应地添加到列表中。

        【讨论】:

          猜你喜欢
          • 2012-11-09
          • 1970-01-01
          • 1970-01-01
          • 2018-05-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-07-30
          • 1970-01-01
          相关资源
          最近更新 更多