为SortedDictionary获取倒数第二个元素

时间:2013-01-30 21:43:53

标签: c# collections dictionary

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

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

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

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

有没有办法获得倒数第二项?我目前正在考虑的方式是获取最后一项,然后计算倒数第二项的内容。我的DateTime键都有一个设置模式,但是,不能保证我完全了解它们。

4 个答案:

答案 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来反转键排序顺序。