获取排序词典的倒数第二个元素

本文关键字:倒数第二 第二个 元素 倒数 排序 获取 | 更新日期: 2023-09-27 17:56:39

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

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

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

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

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

获取排序词典的倒数第二个元素

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

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

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

var secondToLast = mySortedDictionary.Skip(mySortedDictionary.Count - 2).First();

可以使用此方法获取倒数第二个项目。 请注意,它需要迭代整个密钥序列才能获取它,因此效率不高。 另请注意,我基本上忽略了 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();

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

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