2012-07-30 114 views
0

我想让我的头绕过SortedList和SortedDictionary等C#排序集合。我有两个主要的精神障碍者,我找不到任何可以清楚解释他们的地方。我知道这些集合保留自己的默认排序方式,您也可以指定它。排序的集合

我想我的问题很简单;这是如何完成的?我找不到如何写这些东西的简单例子。

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

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

+0

阅读此:http://stackoverflow.com/questions/935621/whats-the-difference-between-sortedlist-and-sorteddictionary/935631#935631。至于示例:请查看MSDN:http://msdn.microsoft.com/en-us/library/ms132319.aspx – RBZ 2012-07-30 22:01:40

回答

0

在树木和堆等数据结构上进行阅读,以红黑树开头。我想这就是一个典型的例子。谷歌和维基百科帮助。

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

+0

谢谢,你能提供一个你如何设置它的例子吗?我理解我只是不知道语法的理论。 – SirYakalot 2012-07-30 22:00:56

+0

嗯我不知道你在得到什么,但在排序列表文档中,它给你选择将IComparer接口作为参数传递到创建的列表。或者您可以确保元素实现一个IComparable来定义排序。 – 2012-07-30 22:04:21

+0

当然,但是语法是什么?喜欢,你怎么写它?就像一个例子。 – SirYakalot 2012-07-30 22:15:50

1

SortedDictionary不会给你一个整数索引器和一个“get minimum key”函数; SortedList的确如此。但是,如果您按顺序插入数据,SortedList效率极低。你应该先订购,然后建立清单。

如果SortedDictionary中缺少的唯一函数是“get minimum key”,那么可以使用FirstFirstOrDefault linq方法,因为枚举器按键顺序返回键值对。如果您需要其他类似的函数(比如“get maximum key”),并且您还需要更高效地插入和删除随机分布的值,那么您应该自己实现一个二进制树(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>()); 
+0

那么集合会自动从低到高排序? – SirYakalot 2012-07-30 22:19:58

+0

@SirYakalot如果您没有提供自己的'IComparer '实例,集合将使用默认比较器,该比较器从低到高排序。因此,默认情况下,收藏集从低到高排序;换句话说,是的,除非另有说明,它们会自动从低到高排序。 – phoog 2012-07-30 22:23:35

+0

啊!我想我明白了!谢谢!有时候这些事情起初很混乱。好吧,无论如何。 – SirYakalot 2012-07-30 22:25:27

0

SortedDictionary是一个平衡树,而SortedList只是一个连续的内存块,恰好包含有序元素。在这两种情况下,我们需要定义什么是“小于”的意思,所以树可以组织其节点和排序列表可以订购它的元素:

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

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