SorteDictionaryはMSDNに準拠しており、キーに基づいてソートされています。それは、あなたがforeachでそれを列挙するときにソートされることを確実にすることができるということですか?または、SortedDictionaryがさまざまなケースでパフォーマンスを向上させるために内部的に動作することを意味しますか?C#:SortedDictionaryは列挙したときソートされますか?
6
A
答えて
3
コレクションを列挙すると、コレクションによって列挙されます(たとえ列挙したとしてもValues
コレクション)。内部的には、コレクションはバイナリ検索ツリーとして実装されています(ドキュメントに従って)。挿入と参照の両方ともO(log n)(かなり効率的です)です。
0
はい、まさにその意味です。
編集:「foreachで列挙したときにソートされることを確実に確認できますか?
7
0
SortedDictionary
の項目を列挙すると、項目は項目キーの並べ替え順に返されます。 SortedDictionary
のキーで列挙すると、キーもソート順に返されます。おそらく驚くべきことに、SortedDictionary
をその値で列挙すると、キーのソート順に値が返されます。ではなく、の値のソート順が予想されます。
デモンストレーション:アイテムがSortedDictionary
に追加このデモでソートされた順序で追加さないあること
注意。
また、その値で辞書を列挙し、の重複する可能性がある場合は、逆引き参照機能return an IEnumerable<T>を使用することを検討してください。 (もちろん、大規模な辞書のために、その値によってキーを検索すると、パフォーマンスが劣化することがあります。)
using System;
using System.Collections.Generic;
using System.Linq;
class SortedDictionaryEnumerationDemo
{
static void Main()
{
var dict = new SortedDictionary<int, string>();
dict.Add(4, "Four");
dict.Add(5, "Five");
dict.Add(1, "One");
dict.Add(3, "Three");
dict.Add(2, "Two");
Console.WriteLine("== Enumerating Items ==");
foreach (var item in dict)
{
Console.WriteLine("{0} => {1}", item.Key, item.Value);
}
Console.WriteLine("\n== Enumerating Keys ==");
foreach (int key in dict.Keys)
{
Console.WriteLine("{0} => {1}", key, dict[key]);
}
Console.WriteLine("\n== Enumerating Values ==");
foreach (string value in dict.Values)
{
Console.WriteLine("{0} => {1}", value, GetKeyFromValue(dict, value));
}
}
static int GetKeyFromValue(SortedDictionary<int, string> dict, string value)
{
// Use LINQ to do a reverse dictionary lookup.
try
{
return
(from item in dict
where item.Value.Equals(value)
select item.Key).First();
}
catch (InvalidOperationException e)
{
return -1;
}
}
}
予想される出力:それらの
== Enumerating Items ==
1 => One
2 => Two
3 => Three
4 => Four
5 => Five
== Enumerating Keys ==
1 => One
2 => Two
3 => Three
4 => Four
5 => Five
== Enumerating Values ==
One => 1
Two => 2
Three => 3
Four => 4
Five => 5
関連する問題
- 1. SortedDictionaryは自動的にソートされますか?
- 2. XSL 1.0でソートされたレコードを列挙する方法は?
- 3. 他のライブラリからインポートされたC++関数を列挙します
- 4. 列挙型はモデルと見なされるべきですか?
- 5. C#で列挙型がint型として格納されていますか?
- 6. Doctrine列挙型で列挙されていない値を追加することはできませんか?
- 7. C++/CLI:管理されていない列挙型から管理された列挙型へのキャスト
- 8. 登録されたURLスキームを列挙しますか?
- 9. コレクションが変更されました。列挙操作が実行されないことがあります。 C#
- 10. Hibernateマッピングは列挙された文字列を永続させました
- 11. 円でソートされた配列とは何ですか?
- 12. DBの列挙型または列挙型の列挙型
- 13. のtypedefと列挙型または列挙型クラス
- 14. Jackson JsonNodeはソートされたキーで文字列にします
- 15. ソートされた配列
- 16. データベースに列挙された列挙型をドキュメントの形式として保持するのがベストプラクティスですか?
- 17. RustにC列挙型をラップすることはできますか?
- 18. C#の列挙型をループすることはできますか?
- 19. 列挙型フィールド内でソートしないでください
- 20. Objective Cでプロパティとして列挙型を使用できますか?
- 21. SortedDictionaryのサブセットをSortedDictionaryとして取得する
- 22. JavaScript:指定されたスコープで非ネイティブオブジェクトを列挙します
- 23. C#列挙型とキャスト
- 24. C#の列挙型とコンボボックス
- 25. 新しい列挙型メンバを追加することはできますか?列挙型として列挙型を列挙するときにNewtonsoft jsonと中断しないでください。
- 26. Cの型保証された列挙型?
- 27. ソートされた配列をユーザーに依頼するループC++
- 28. テーブルがソートされたときに削除されたばかりのデータが追加されました
- 29. SortedDictionary(C#) - 値を変更
- 30. イメージを配列または列挙型として格納します。これは良いですか?
1? :p – Svish
ソートされていることが保証されていますか? (それがない正規の辞書と比較して) – Svish