我正试图绕过C#排序的集合,例如SortedList和SortedDictionary。我有两个主要的心理障碍,我无法找到任何能够清楚解释它们的地方。我知道有一种默认方式可以让这些集合保持自己的排序,并且您也可以指定它。
我想我的问题很简单;这是怎么做到的?我找不到任何关于如何写这些东西的简单例子。
比如说我想要一个集合来存储从float到int的键值对,我希望能够通过查询集合中的最低浮点值来获取int。换句话说,我想获得具有最低关联浮点键的int。我是否正确地认为集合被排序的事实使得做这种事情更有效率?这是否也意味着我可以抓住集合中的第一个元素,如:collection [0]?它会是最低的? (如果我按照这种方式排序的话)
对不起,这个问题不是更简洁,我只是不确定从哪里开始。
答案 0 :(得分:1)
SortedDictionary不提供整数索引器,也不提供“获取最小键”功能; SortedList有。但是,如果您不按顺序插入数据,SortedList效率极低。您应该首先订购它,然后构建列表。
如果SortedDictionary中缺少的唯一函数是“获取最小密钥”,那么您可以使用First
或FirstOrDefault
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只是一个连续的内存块,碰巧包含有序元素。在这两种情况下,我们需要定义“小于”的含义,因此树可以组织其节点,排序列表可以对其元素进行排序:
在您的情况下(其中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
编程愉快!