3

我有一个看起来像这样的排序字典:

SortedDictionary<DateTime, string> mySortedDictionary = GetDataSource();

为了获得最后一个元素,我注意到我能够做到这一点:

DateTime last = Convert.ToDateTime(mySortedDictionary.Keys.Last());

有没有办法获得倒数第二个项目?我目前正在考虑的方式涉及获取最后一个项目,然后计算倒数第二个项目是什么。我的 DateTime 键都有一个固定的模式,但是,不能保证我完全知道它们。

4

4 回答 4

3
dictionary.Keys.Reverse().Skip(1).FirstOrDefault()

这需要O(n)时间,但据我所知,似乎没有快速的解决方案。

于 2013-01-30T21:54:50.253 回答
3

使用 linq,您可以跳过所有项目,直到倒数第二个并取第一个(但首先检查字典是否至少有 2 个元素):

var secondToLast = mySortedDictionary.Skip(mySortedDictionary.Count - 2).First();
于 2013-01-30T21:55:05.917 回答
0

您可以使用此方法获取倒数第二个项目。请注意,它需要迭代整个键序列才能获得它,因此效率不高。另请注意,我大多忽略了 0 或 1 项序列的情况;如果您不想获得默认值,您可以检查它并抛出,或做其他事情。

public static T SecondToLast<T>(this IEnumerable<T> source)
{
    T previous = default(T);
    T current = default(T);
    foreach (var item in source)
    {
        previous = current;
        current = item;
    }

    return previous;
}

要使用它:

DateTime secondToLast = mySortedDictionary.Keys.SecondToLast();
于 2013-01-30T21:52:57.257 回答
0

您可以存储反转的密钥吗?在这种情况下,您可以使用mySortedDictionary.Skip(1).FirstOrDefault().

IComparer您可以通过在构造函数中指定(简单)自定义来反转键排序顺序。

于 2013-01-30T22:10:01.807 回答