我有一个看起来像这样的排序字典:
SortedDictionary<DateTime, string> mySortedDictionary = GetDataSource();
为了获得最后一个元素,我注意到我能够做到这一点:
DateTime last = Convert.ToDateTime(mySortedDictionary.Keys.Last());
有没有办法获得倒数第二项?我目前正在考虑的方式是获取最后一项,然后计算倒数第二项的内容。我的DateTime键都有一个设置模式,但是,不能保证我完全了解它们。
答案 0 :(得分:3)
dictionary.Keys.Reverse().Skip(1).FirstOrDefault()
这需要O(n)
时间,但据我所知,似乎没有快速解决方案。
答案 1 :(得分:3)
使用linq你可以跳过所有项目直到倒数第二个并取第一个(但首先检查字典是否至少包含2个元素):
var secondToLast = mySortedDictionary.Skip(mySortedDictionary.Count - 2).First();
答案 2 :(得分: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();
答案 3 :(得分:0)
你能把钥匙存放起来吗?在这种情况下,您只需使用mySortedDictionary.Skip(1).FirstOrDefault()
。
您可以通过在构造函数中指定(简单)自定义IComparer
来反转键排序顺序。