C# のコレクション
コレクションは .NET FCL (フレームワーク クラス ライブラリ) の重要な部分であり、開発で最も一般的に使用される関数の 1 つです。よく言われるように、IEnumerable、IEnumerator、および ICollection を見たとき、それが何なのか、そしてなぜそうなるのかを理解してください。それらの違いがわかりますか? List と Dictionary 以外に、他にどのようなコレクション クラスを使用したことがありますか?さっそく、今日はコレクション クラスとその実装を定義するインターフェイスのいくつかを見てみましょう。
まず、FCL が提供するインターフェイスを見てみましょう:
public interface IEnumerator { bool MoveNext(); object Current { get; } void Reset(); }
IEnumerator は、コレクション内の各要素への一方向の前方アクセスを実現できるように、コレクションを走査するための基本的なメソッドを定義します。 IEnumerable には、トラバーサーである GetEnumerator というメソッドが 1 つだけあります。
りー注: 私たちがよく使用する foreach は、実際には Enumerator の Current と MoveNext によって実装されたトラバーサル関数を呼び出します。
りー上記のコードで使用されている foreach と列挙子は、最終的に IL の列挙子の MoveNext と Current に変換されます。
IEnumerable は非常に便利なインターフェイスです。実装すると次のような利点があります。 foreach ステートメントをサポート
標準のコレクション クラスとして他のライブラリと対話します
より複雑なコレクションインターフェイスのニーズを満たす
コレクション初期化子をサポートします
もちろん、それを達成するには次のようにさまざまな方法があります:
コレクションが他のコレクション クラスをカプセル化することによって取得される場合、このコレクションの列挙子を直接返すことができます
イールドリターンを通じてリターン
独自の IEnumerator を実装して
を実現します ここでは、yield を通じて列挙子を返す方法を説明します
public interface IEnumerable { IEnumerator GetEnumerator(); }
上部の最初の図から、ICollection が IEnumerable から直接継承されていることがわかります。実際、これも当てはまります。ICollection は、基本的なトラバーサル関数を提供するだけでなく、次の機能もサポートしていると言えます。 セットと要素の数を数えます
ICollection は ICollection8742468051c85b06f0a0af9e3e506b5c とは少し異なります。ICollection にはコレクションの編集機能、つまり追加と削除がありません。要素が存在するかどうかのチェックを含める Contains はサポートされていません。
SortedDictionary8c189faf63255a5ea96468ba21dd0564
ソートされたリスト
Dictionary8c189faf63255a5ea96468ba21dd0564 は、おそらく最も一般的に使用される連想コレクションであり、データのアクセス、追加、削除にかかる時間は、ストレージ構造として内部的に Hashtable を使用するため、すべてのコレクション クラスの中で最も高速です。保存されるキーと値のペアの数、クエリ/追加/削除にかかる時間は同じで、時間計算量は O(1) です。
Dictionary8c189faf63255a5ea96468ba21dd0564利点は検索と挿入が速いことですが、欠点は何ですか? Hashtable がストレージ構造として使用されているため、内部のデータは順序付けされていないため、Dictionary
TKey タイプとして、GetHashCode() と Equals() を実装するか、IEqualityComparer を提供する必要があります。そうしないと、操作に問題が発生する可能性があります。
並べ替えられた辞書8c189faf63255a5ea96468ba21dd0564 SortedDictionary8c189faf63255a5ea96468ba21dd0564 と Dictionary8c189faf63255a5ea96468ba21dd0564 はほぼ似ていますが、実装には若干の違いがあります。 SortedDictionary8c189faf63255a5ea96468ba21dd0564 は、ストレージ構造としてバイナリ ツリーを使用します。そしてキー順に並べました。この場合、SortedDictionaryIComparable
下付き文字を押してのアクセスはサポートされていません
先入れ先出しキュー
下付き文字をクリックしてのアクセスはサポートされていません
コレクション |
順番に |
連順倉庫 |
直接アクセス方法 |
訪問時間 |
稼働時間 |
備考 |
辞書 |
|
はい |
鍵 |
キー: お(1)
|
お(1) |
アクセスパフォーマンスは最速ですが、ソートはサポートしていません |
ソート辞書 |
順番に並べます |
いいえ |
鍵 |
キー: |
O(ログn) |
高速アクセスと並べ替えのサポートとのトレードオフ |
ソートリスト |
順番に並べます |
はい |
鍵 |
キー: O(ログn)
|
お(ん) |
SortedDictionary と似ていますが、ストレージ構造としてツリーではなくデータが内部的に使用される点が異なります。 |
リスト |
ユーザーは要素の位置を正確に制御できます |
はい |
インデックス |
インデックス: O(1) 値: O(n)
|
お(ん) |
各要素に直接アクセスする必要がある小規模なコレクションに最適です。 |
リンクリスト |
ユーザーは要素の位置を正確に制御できます |
いいえ |
サポートされていません |
値: お(ん)
|
お(1) |
個々の要素に直接アクセスする必要はないが、コレクションへの非常に頻繁な追加/削除が必要なシナリオに最適です。 |
ハッシュセット |
サポートされていません |
はい |
鍵 |
キー: お(1)
|
お(1) |
要素のユニークさを維持したコレクション。並べ替えはサポートされていません |
ソートセット |
順番に並べます |
いいえ |
鍵 |
キー: O(ログn)
|
O(ログn) |
要素の一意性を維持し、並べ替えをサポートできます。 |
スタック |
リフォ |
はい |
最上位の要素のみを取得できます |
トップ: O(1) |
お(1) |
|
キュー |
先入れ先出し |
はい |
最下部の要素のみを取得できます |
フロント: O(1) |
お(1) |
|
ジェネリック コレクション クラスは .NET 2.0 で登場しました。つまり、.NET 1.0 にはそのような便利なものはありませんでした。現在では、古いコードとの互換性を維持するための作業を行う場合を除いて、基本的にこれらのコレクション クラスは使用しません。 1.0 時代に .NET プログラマが使用できるコレクション クラスを見てみましょう。
配列リスト
後に List8742468051c85b06f0a0af9e3e506b5c に置き換えられました。
HashTable は後に Dictionary
Queue は後に Queue8742468051c85b06f0a0af9e3e506b5c に置き換えられました。
SortedList は後に SortedList8742468051c85b06f0a0af9e3e506b5c に置き換えられました。
Stack は後に Stack
ConcurrentQueue Queue のスレッドセーフ バージョン
ConcurrentStack Stack のスレッドセーフ バージョン
ConcurrentBag のスレッドセーフなオブジェクト コレクション
ConcurrentDictionary スレッドセーフな辞書
ブロックコレクション
.NET によって提供されるコレクション クラスは、最も一般的に使用されるツール クラスの 1 つです。この記事が、これらのコレクション クラスについての理解を深めるのに役立つことを願っています。もちろん、個人的にはまだ不完全な点があると感じています。たとえば、HashTable と Binary Search Tree は詳細に研究されていませんし、一方向リンク リストと二重リンク リストの比較についてはこの記事では言及されていません。興味のある友達は、さらに詳しく知ることができます。
以上がC# コレクション型のグラフィック コードの詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。