この質問が表示されます。
.Net3.5のSortedDictionaryの最後の要素を取得するにはどうすればよいですか。
LINQを使用できます。
var lastItem = sortedDict.Values.Last();
最後のキーを取得することもできます。
var lastkey = sortedDict.Keys.Last();
最後のキーと値のペアを取得することもできます。
var lastKeyValuePair = sortedDict.Last();
これにより、KeyValuePair<TKey, TValue>withKeyとValueプロパティが提供されます。
辞書が空の場合、これは例外をスローすることに注意してください。それが必要ない場合は、に電話してLastOrDefaultください。
Last拡張メソッドによって結果が得られますが、そこに到達するにはコレクション全体を列挙する必要があります。SortedDictionary<K, V>公開されていないのはとても残念でありMin、メンバーは特に内部的にそれが持つプロパティにMax支えられていることを考慮しています。SortedSet<KeyValuePair<K, V>>MinMax
O(n) が望ましくない場合は、いくつかのオプションがあります。
に切り替えますSortedList<K, V>。繰り返しますが、何らかの理由で、BCL はデフォルトでこれをパックしません。インデクサーを使用して、O(1) 時間で最大 (または最小) 値を取得できます。拡張メソッドで拡張するといいでしょう。
//Ensure you dont call Min Linq extension method.
public KeyValuePair<K, V> Min<K, V>(this SortedList<K, V> dict)
{
    return new KeyValuePair<K, V>(dict.Keys[0], dict.Values[0]); //is O(1)
}
//Ensure you dont call Max Linq extension method.
public KeyValuePair<K, V> Max<K, V>(this SortedList<K, V> dict)
{
    var index = dict.Count - 1; //O(1) again
    return new KeyValuePair<K, V>(dict.Keys[index], dict.Values[index]);
}
SortedList<K, V>他のペナルティが伴います。だからあなたは見たいと思うかもしれません:SortedListとSortedDictionaryの違いは何ですか?
独自のSortedDictionary<K, V>クラスを作成します。これは非常に簡単です。をSortedSet<KeyValuePair<K, V>>内部コンテナとして使用し、Keyパーツに基づいて比較します。何かのようなもの:
public class SortedDictionary<K, V> : IDictionary<K, V>
{
    SortedSet<KeyValuePair<K, V>> set; //initialize with appropriate comparer
    public KeyValuePair<K, V> Min { get { return set.Min; } } //O(log n)
    public KeyValuePair<K, V> Max { get { return set.Max; } } //O(log n)
}
これは O(log n) です。文書化されていませんが、コードを確認しました。
SortedDictionary<K, V>クラスと呼び出しMinとMaxプロパティのプライベートメンバーであるバッキングセットにアクセスするには、手間のかかるリフレクションを使用します。式に依存してデリゲートをコンパイルし、パフォーマンスのためにキャッシュすることができます。そうするのは非常に悪い選択です。私がこれを提案したなんて信じられない。
たとえば、他の実装に依存します。TreeDictionary<K, V>C5 からの場合。両方FindMinともO(log n) ですFindMax 
使用できますSortedDictionary.Values.Last();
または、キーと値が必要な場合
SortedDictionary.Last();
    SortedList リスト...
list[ Keys[Keys.Count - 1] ];  // returns the last entry in list
    人々がすでに指摘しているように、 Last extension はコレクション全体を列挙するため、パフォーマンスへの影響は致命的となる可能性があります。SortedDict から 10000 個の最後の要素を削除するだけで、SortedSet での同様の操作よりもはるかに時間がかかりました。
SortedSet 削除の経過ミリ秒: 8
SortedDict 削除経過ミリ秒: 3697
// 以下のコードでは、ss は SortedSet で、sd は SortedDictionary であり、どちらも同じ 10000 要素を含んでいます。
 sw.Start();
 while (ss.Count != 0)
 {
     ss.Remove(ss.Max);
 }
 sw.Stop();
 Console.WriteLine("SortedSet Removal Elapsed ms : {0}", sw.ElapsedMilliseconds);
 sw.Reset();
 sw.Start();
 while (sd.Count != 0)
 {
     sd.Remove(sd.Keys.Last());
 }
 sw.Stop();
 Console.WriteLine("Dict Removal Elapsed ms : {0}", sw.ElapsedMilliseconds);