14

この質問が表示されます。

.Net3.5のSortedDictionaryの最後の要素を取得するにはどうすればよいですか。

4

5 に答える 5

20

LINQを使用できます。

var lastItem = sortedDict.Values.Last();

最後のキーを取得することもできます。

var lastkey = sortedDict.Keys.Last();

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

var lastKeyValuePair = sortedDict.Last();

これにより、KeyValuePair<TKey, TValue>withKeyValueプロパティが提供されます。

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

于 2009-10-23T12:09:03.610 に答える
20

Last拡張メソッドによって結果が得られますが、そこに到達するにはコレクション全体を列挙する必要があります。SortedDictionary<K, V>公開されていないのはとても残念でありMin、メンバーは特に内部的にそれが持つプロパティにMax支えられていることを考慮しています。SortedSet<KeyValuePair<K, V>>MinMax

O(n) が望ましくない場合は、いくつかのオプションがあります。

  1. に切り替えます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の違いは何ですか?

  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>クラスと呼び出しMinMaxプロパティのプライベートメンバーであるバッキングセットにアクセスするには、手間のかかるリフレクションを使用します。式に依存してデリゲートをコンパイルし、パフォーマンスのためにキャッシュすることができます。そうするのは非常に悪い選択です。私がこれを提案したなんて信じられない。

  4. たとえば、他の実装に依存します。TreeDictionary<K, V>C5 からの場合。両方FindMinともO(log n) ですFindMax

于 2014-06-11T16:12:58.390 に答える
2

使用できますSortedDictionary.Values.Last();

または、キーと値が必要な場合

SortedDictionary.Last();
于 2009-10-23T12:09:01.770 に答える
0

SortedList リスト...

list[ Keys[Keys.Count - 1] ];  // returns the last entry in list
于 2016-02-03T14:16:17.120 に答える
0

人々がすでに指摘しているように、 Last extension はコレクション全体を列挙するため、パフォーマンスへの影響は致命的となる可能性があります。SortedDict から 10000 個の最後の要素を削除するだけで、SortedSet での同様の操作よりもはるかに時間がかかりました。

  1. SortedSet 削除の経過ミリ秒: 8

  2. 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);
    
于 2020-09-19T17:19:21.297 に答える