この質問が表示されます。
.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>>
Min
Max
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);