在阅读使用Linq和SortedList后会发生什么的文档后,我感到很困惑。
https://msdn.microsoft.com/en-us/library/ms132319(v=vs.110).aspx
我猜这个枚举是保证排序的,也可以通过索引检索,但是值和键呢?所有这些案件都安全吗?
var list = new SortedList<DateTime, object>();
//add entries here ...
var firstValue1 = list.Values[0];
var firstValue2 = list.First().Value;
var firstValue3 = list.Values.First();
var firstKey1 = list.Keys[list.Count-1];
var firstKey2 = list.First().Key;
var firstKey3 = list.Keys.First();
var sortedList = list.Where(x => x.Key > DateTime.Now)
.Select(x => x.Value);
答案 0 :(得分:2)
阅读文档......
来自documentation on the Values property:
“
IList<T>
中的值的顺序与SortedList<TKey, TValue>
中的顺序相同。”
来自documentation on the Keys property:
“
IList<T>
中的键的顺序与SortedList<TKey, TValue>
中的顺序相同。”
答案 1 :(得分:0)
您可以在此处查看源代码:
显然,Keys
属性只是这个类实例的包装:
如果您查看GetEnumerator()
方法,则可以看到它创建了SortedListKeyEnumerator
。这是源代码:
据我所知,MoveNext()
只会迭代所包含的SortedList
的键。
您可以找到Values
工作方式的相同方式。
答案 2 :(得分:0)
如果查看Enumerable.cs的源代码,您将看到没有谓词的重载只是尝试将源视为IList,如果这不起作用,它将使用枚举器返回第一个元素。索引和枚举器都应该由SortedList类在内部处理,以便您获得适当的(排序的)结果:
public static TSource First<TSource>(this IEnumerable<TSource> source) {
if (source == null) throw Error.ArgumentNull("source");
IList<TSource> list = source as IList<TSource>;
if (list != null) {
if (list.Count > 0) return list[0];
}
else {
using (IEnumerator<TSource> e = source.GetEnumerator()) {
if (e.MoveNext()) return e.Current;
}
}
throw Error.NoElements();
}
谓词的重载略有不同,因为它使用枚举器对每个项执行谓词,查找第一个匹配项:
public static TSource First<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate) {
if (source == null) throw Error.ArgumentNull("source");
if (predicate == null) throw Error.ArgumentNull("predicate");
foreach (TSource element in source) {
if (predicate(element)) return element;
}
throw Error.NoMatch();
}
无论哪种方式,你都应该得到相同的(排序的)结果。