2009-10-23 105 views

答えて

15

あなたが使用することができますLINQは:

var lastItem = sortedDict.Values.Last(); 

また、最後のキーを取得することができます:

var lastkey = sortedDict.Keys.Last(); 

あなたも、最後のキーと値のペアを取得することができます。

var lastKeyValuePair = sortedDict.Last(); 

これはあなたにKeyKeyValuePair<TKey, TValue>Value特性を与えるだろう。

辞書が空の場合は例外がスローされることに注意してください。あなたがそれを望まないなら、LastOrDefaultに電話してください。

+5

を持っています。列挙なしで最後の要素(または任意の位置インデックスからの要素)を取得する方法があるのだろうか? SortedDictionaryはツリーにソートされているので、理論的には可能でしょうか? –

+1

@RolandPihlakas:理論的には、はい。実際には、そうは思わない。 – SLaks

+9

C++のバックグラウンドを持つ人にとって、これは受け入れがたいです。最後の要素を取得するために並べ替えられた辞書全体を列挙することは、無駄に非効率的です。より多くのC#コレクションライブラリがありますか? –

1

あなたはSortedDictionary.Values.Last();

を使用するかは、キーと値をしたい場合は

SortedDictionary.Last(); 
10

Last拡張メソッドを使用すると結果は得られますが、コレクション全体を列挙してそこに移動する必要があります。それはそのような恥ですSortedDictionary<K, V>MinMaxのメンバーは、特に内部的にはSortedSet<KeyValuePair<K, V>>MinMaxの属性を持っています。 SortedList<K, V>

  1. スイッチ:O(n)が望ましくない場合

    は、あなたはいくつかのオプションがあります。再度何らかの理由で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>には他のペナルティが付属しています。だからあなたは見たいかもしれない:What's the difference between SortedList and SortedDictionary?

  2. あなた自身の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)です。文書化されていませんが、コードをチェックしました。

  3. SortedDictionary<K, V>クラスのプライベートメンバーであるバッキングセットにアクセスするためにfiddly reflectionを使用し、MinおよびMaxプロパティを呼び出します。式を使用してデリゲートをコンパイルし、パフォーマンスのためにキャッシュすることができます。これは非常に貧しい選択です。私はこれを示唆したとは信じられません。

  4. たとえば、他の実装に依存します。 TreeDictionary<K, V> from C5の場合。彼らは、これらのメソッドはおそらくトリガー列挙をFindMinFindMaxboth of which are O(log n)

+0

これらのオプションを並べ替えて、より良いオプションが上部にあるように並べ替えたいと思うかもしれません。 – Servy

+0

2番目のオプションのインデクサー/ 'TryGetValue'をどのように実装しますか? – CodesInChaos

+0

@ CodeInChaosあなたが正しいです、それは役に立たなくなります。 .NETの悲しいセットは、実際の参照を取得する方法を公開していません。私は答えを編集する必要があります。 – nawfal

-1

SortedListのリスト...

list[ Keys[Keys.Count - 1] ]; // returns the last entry in list 
関連する問題