获取排序词典的倒数第二个元素
本文关键字:倒数第二 第二个 元素 倒数 排序 获取 | 更新日期: 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
来反转键排序顺序。