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 は ICollection
SortedDictionary
ソートされたリスト
Dictionary
Dictionary
TKey タイプとして、GetHashCode() と Equals() を実装するか、IEqualityComparer を提供する必要があります。そうしないと、操作に問題が発生する可能性があります。
並べ替えられた辞書IComparable
下付き文字を押してのアクセスはサポートされていません
先入れ先出しキュー
下付き文字をクリックしてのアクセスはサポートされていません
コレクション |
順番に |
連順倉庫 |
直接アクセス方法 |
訪問時間 |
稼働時間 |
備考 |
辞書 |
|
はい |
鍵 |
キー: お(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 プログラマが使用できるコレクション クラスを見てみましょう。
配列リスト
後に List
HashTable は後に Dictionary
Queue は後に Queue
SortedList は後に SortedList
Stack は後に Stack
ConcurrentQueue Queue のスレッドセーフ バージョン
ConcurrentStack Stack のスレッドセーフ バージョン
ConcurrentBag のスレッドセーフなオブジェクト コレクション
ConcurrentDictionary スレッドセーフな辞書
ブロックコレクション
.NET によって提供されるコレクション クラスは、最も一般的に使用されるツール クラスの 1 つです。この記事が、これらのコレクション クラスについての理解を深めるのに役立つことを願っています。もちろん、個人的にはまだ不完全な点があると感じています。たとえば、HashTable と Binary Search Tree は詳細に研究されていませんし、一方向リンク リストと二重リンク リストの比較についてはこの記事では言及されていません。興味のある友達は、さらに詳しく知ることができます。
以上がC# コレクション型のグラフィック コードの詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。