【问题标题】:C# alternative for the C++ STL set<T>C++ STL set<T> 的 C# 替代方案
【发布时间】:2010-11-07 13:13:36
【问题描述】:

我正在寻找一种类似于 STL 集(T)的排序数据结构。 我找到了 SortedList,但它需要 (key, val),我正在寻找类似 List(string) 的东西 - 仅排序。

我在网上找到了 Spring.Collections,但我的框架无法识别它。

我可以在常规的基本框架中使用一个简单的 SortedSet 吗?

谢谢, 加尔

【问题讨论】:

标签: c# sorted


【解决方案1】:

您可以使用 System.Collections.Generic.Dictionary 来做到这一点。这是一篇好文章:Dictionarys and sorting

编辑: SortedDictionary 似乎是better

【讨论】:

  • 谢谢。但这正是我试图避免的:拥有 。我正在寻找一个只有值的排序数据结构,比如 List,但我想没有,所以我会使用你的解决方案。 :-)
【解决方案2】:

.NET 4.0中引入的SortedSet就是你要找的,见MSDNhere

【讨论】:

    【解决方案3】:

    还可以对List&lt;T&gt; 进行排序。默认情况下不排序,但您可以对其进行排序,即使您愿意,也可以使用自定义排序算法。

    【讨论】:

      【解决方案4】:

      除了SortedDictionary&lt;K,V&gt;SortedList&lt;K,V&gt; 之外,框架中没有内置任何内容。

      C5 Collections 库有几个排序集合。根据您的具体要求,以下方法之一应该可以解决问题:SortedArray&lt;T&gt;TreeBag&lt;T&gt;TreeSet&lt;T&gt;

      还有Power Collections,提供OrderedBag&lt;T&gt;OrderedSet&lt;T&gt;集合。

      【讨论】:

        【解决方案5】:

        有一个 System.Collections.SortedList 或 System.Collections.Generic.SortedList 总是排序的。 或者您可以使用 Array.Sort 方法对定义的时刻进行排序。

        【讨论】:

          【解决方案6】:

          使用 List 并调用 Sort 方法怎么样?

          不是扩展,但试试这个

          public class SortedList<T>: List<T>
          {
              public SortedList(): base()
              {
              }
              public SortedList(IEnumerable<T> collection): base(collection)
              {
              }
              public SortedList(int capacity)
                  : base(capacity)
              {
              }
          
              public void AddSort(T item)
              {
                  base.Add(item);
                  this.Sort();
              }
          }
          

          这只是一个起点,但添加了一个新方法 AddSort。

          将使用扩展方法来更改 List.Add 方法并在其末尾调用排序。

          使用扩展方法

          将以下内容放在您的代码可访问的命名空间中:

          public static class ListExtension
          {
              public static void AddSort<T>(this List<T> list, T item)
              {
                  list.Add(item);
                  list.Sort();
              }
          }
          

          你可以使用如下代码:

          List<int> newList = List<int>();
          newList.AddSort(6);
          newList.AddSort(4);
          newList.AddSort(3);
          

          值将是:

          新列表[0] == 3 新列表[1] == 4 新列表[3] == 6

          您也可以只使用 newList.Add,然后在调用 newList.AddSort 时对列表进行排序

          【讨论】:

          • 这有一个复杂性的损失,使用排序的数据结构会更快,该结构以排序的方式插入值。
          • 你不能使用扩展方法来包含这种行为吗?
          • 嗯,使用排序的数据结构,以排序的方式插入值开始是一种方式 - 就像 SortedDictionary,但是你必须使用 ,我一直在寻找只有 ... 的东西更简单
          • @Gal:在我的答案中添加了一个基于 List 的新类,它非常粗糙且准备就绪,但可以满足您的需求。理想情况下,我正在研究 List.Add() 方法的扩展,这将是我的首选路线。
          • @Gal 刚刚为您添加了一个示例 entension 方法到 List 类。
          猜你喜欢
          • 2010-09-10
          • 1970-01-01
          • 1970-01-01
          • 2011-03-20
          • 1970-01-01
          • 1970-01-01
          • 2014-02-11
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多