已整理的集合

时间:2012-07-30 21:55:34

标签: c# collections

我正试图绕过C#排序的集合,例如SortedList和SortedDictionary。我有两个主要的心理障碍,我无法找到任何能够清楚解释它们的地方。我知道有一种默认方式可以让这些集合保持自己的排序,并且您也可以指定它。

我想我的问题很简单;这是怎么做到的?我找不到任何关于如何写这些东西的简单例子。

比如说我想要一个集合来存储从float到int的键值对,我希望能够通过查询集合中的最低浮点值来获取int。换句话说,我想获得具有最低关联浮点键的int。我是否正确地认为集合被排序的事实使得做这种事情更有效率?这是否也意味着我可以抓住集合中的第一个元素,如:collection [0]?它会是最低的? (如果我按照这种方式排序的话)

对不起,这个问题不是更简洁,我只是不确定从哪里开始。

4 个答案:

答案 0 :(得分:1)

SortedDictionary不提供整数索引器,也不提供“获取最小键”功能; SortedList有。但是,如果您不按顺序插入数据,SortedList效率极低。您应该首先订购它,然后构建列表。

如果SortedDictionary中缺少的唯一函数是“获取最小密钥”,那么您可以使用FirstFirstOrDefault linq方法,因为枚举器按键顺序返回键值对。如果你需要其他类似的函数(比如“获取最大键”),并且你还需要更有效地插入和删除随机分布的值,你应该自己实现一个二进制树(SortedDictionary是)来公开这些函数

要实施IComparer<T>,请创建一个新类:

public class FloatComparer : IComparer<float>
{
    public int Compare(float a, float b)
    {
        //your logic goes here; return -1 if a should be considered smaller or 1 if b should be considered smaller
    }
}

然后以通常的方式将其传递给已排序集合的构造函数:

var collection = new SortedDictionary<float>(new IComparer<float>());

答案 1 :(得分:0)

阅读树木和堆等数据结构等。从Red Black Tree开始。我猜这是典型的例子。谷歌和维基百科的帮助。

基本上你插入的东西有某种定义,允许它比较大,相等,小于。在插入时,元素被比较和排序。因此,当您搜索第一个或最后一个时,您知道它们是最小的或最大的。例如,您还可以有效地检查结构中是否存在等于4的整数。

答案 2 :(得分:0)

SortedDictionary是一个平衡树,而SortedList只是一个连续的内存块,碰巧包含有序元素。在这两种情况下,我们需要定义“小于”的含义,因此树可以组织其节点,排序列表可以对其元素进行排序:

  • 如果将实现IComparer的对象传递给这些容器的构造函数,那就是使用它。只要它是一个严格的弱序,它将工作正常。例如,通过提供“大于”比较器,可以很容易地对容器进行反向排序。
  • 否则,使用default comparer

在您的情况下(其中float是键),默认比较器将执行正确的操作并从最低到最高值对元素进行排序。获得第一个元素将是有效的,第一个元素也恰好是最低值。

答案 3 :(得分:0)

很简单。

假设您有一个名为series的排序字典,该字典将双精度数组与日期相关联。

公共SortedDictionary系列= new SortedDictionary();

您已经将其加载了数据。

您可以按以下方式获得第一项(按排序顺序的第一项):

  var firstItem = series.First();

  firstItem.Key is the first date.

  firstItem.Value is the array of doubles associated with the first date

编程愉快!