3

次のようなソート済み辞書があります。

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

最後の要素を取得するために、私はこれを行うことができることに気付きました:

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

最後から2番目のアイテムを取得する方法はありますか? 私が現在考えている方法は、最後の項目を取得してから、最後から 2 番目の項目が何であるかを計算することです。私の DateTime キーにはすべて一定のパターンがありますが、正確に知っているとは限りません。

4

4 に答える 4

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

これにはO(n)時間がかかりますが、私が知る限り、迅速な解決策はないようです。

于 2013-01-30T21:54:50.253 に答える
3

linq を使用すると、最後から 2 番目の項目まですべての項目をスキップして、最初の項目を取得できます (ただし、辞書に少なくとも 2 つの要素があるかどうかを最初に確認してください)。

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

このメソッドを使用して、最後から 2 番目の項目を取得できます。取得するにはキーのシーケンス全体を反復する必要があるため、効率的ではないことに注意してください。また、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 に答える