0

我试图了解诸如 SortedList 和 SortedDictionary 之类的 C# 排序集合。我有两个主要的精神障碍,我找不到任何地方可以清楚地解释它们。我知道这些集合有一种默认的方式来保持自己的排序,您也可以指定这一点。

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

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

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

4

4 回答 4

1

SortedDictionary 没有给你一个整数索引器,也没有一个“获取最小键”功能;SortedList 可以。但是,如果您乱序插入数据,SortedList 的效率就会非常低。您应该先订购它,然后再构建列表。

如果 SortedDictionary 中缺少的唯一功能是“获取最小键”,那么您可以使用Firstor FirstOrDefaultlinq 方法,因为枚举器按键顺序返回键值对。如果您需要其他类似的功能(例如“获取最大键”),并且还需要更有效地插入和删除随机分布的值,您可能应该自己实现公开这些功能的二叉树(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>());
于 2012-07-30T22:06:12.707 回答
0

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

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

在您的情况下(float关键在哪里),默认比较器将做正确的事情并将元素从最低值到最高值排序。获取第一个元素将是有效的,并且第一个元素也恰好是最低值。

于 2012-07-30T23:05:48.813 回答
0

阅读树和堆等数据结构。从红黑树开始。我想这就是经典的例子。谷歌和维基百科有帮助。

基本上,您插入的内容具有某种定义,可以将其比较为更大、等于、小于。在插入时,对元素进行比较和排序。因此,当您搜索第一个或最后一个时,您会知道它们是最小的还是最大的。例如,您还可以有效地检查结构中是否存在等于 4 的整数。

于 2012-07-30T21:57:29.117 回答
0

这很简单。

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

public SortedDictionary series = new SortedDictionary();

你已经用数据加载了它。

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

  var firstItem = series.First();

  firstItem.Key is the first date.

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

快乐编程!

于 2019-01-27T06:15:43.730 回答