SortedList和Linq

时间:2017-05-09 13:47:43

标签: c# sortedlist

在阅读使用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);

3 个答案:

答案 0 :(得分:2)

阅读文档......

来自documentation on the Values property

  

IList<T>中的值的顺序与SortedList<TKey, TValue>中的顺序相同。”

来自documentation on the Keys property

  

IList<T>中的键的顺序与SortedList<TKey, TValue>中的顺序相同。”

答案 1 :(得分:0)

您可以在此处查看源代码:

https://referencesource.microsoft.com/#System/compmod/system/collections/generic/sortedlist.cs,de670561692e4a20

显然,Keys属性只是这个类实例的包装:

https://referencesource.microsoft.com/#System/compmod/system/collections/generic/sortedlist.cs,374aa21b960ae2e2

如果您查看GetEnumerator()方法,则可以看到它创建了SortedListKeyEnumerator。这是源代码:

https://referencesource.microsoft.com/#System/compmod/system/collections/generic/sortedlist.cs,a4492235f85c77d8

据我所知,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();
    }

无论哪种方式,你都应该得到相同的(排序的)结果。