アレイ


Collectathonに実装されている様々なデータ構造を議論するとき、最もよい出発点は最も簡単です.trieが、動的にサイズ変更された配列を使用して様々な子参照を保持する方法を説明する方法を説明すると、基本コンポーネントに慣れていない場合は全く意味がありません.そして、絶対的な最も基本的なデータ構造は何ですか?classまたはstructのように、言語内で直接実装されていることを無視すると、それは配列になります.すべての配列の最も基本的な、固定サイズの配列には確かによく知られています.しかし、あなたは非常に文字通りまだ配列であるかの上に実装されることができるより高度な行動があるということを知っていましたか?

Int 32 []とBoundedArray < Telement >


私は、2つのタイプをすぐに導入しています、そして、それは大部分のコレクション全体で一般的な傾向です.なぜ?両方とも、全く同じ方法を振る舞うので、1つである唯一の違いで、他はそうでありません.

結合性


あなたが連想性に慣れていないならば、すぐに脇に、新しい学習者が特にそれに苦労すると言われたので、連想はちょうど要素が特定のインデックスでコレクションに入力されることを意味します.これがはっきりしなければならない例があります.

境界


境界線は、配列が最大の境界またはサイズを持っているという考えです.これは、標準の固定サイズの配列から区別する単一の特性で、5つの要素の配列を持つ代わりに、0、1、2、3、4、または5つの要素を持つ配列があります!SQLでたくさん動作する場合は、SQL文字フィールドが制限された配列であることを認識してください.

用途


最初に、それがもう少しまっすぐ進むので、 BoundedArray<TIndex, TElement> を見ましょう.
固定サイズ配列と比較してどのように宣言して構築するか
public readonly Int32[] fixedArray =
    new Int32[] { 1, 2, 3, 4, 5 };
public readonly BoundedArray<Int32> boundedArray =
    new BoundedArray<Int32>(5) { 1, 2, 3, 4, 5 };
これらはほぼ同じことを考慮して意味をなさなければなりません.しかし、何か他のものをあなたに見せさせてください.BoundedArray<TElement> BoundedArray<TElement> をサポートしている.
public readonly BoundedArray<Int32> boundedArray =
    new Int32[] { 1, 2, 3, 4, 5 };
事実上、どんな固定された配列も制限されたサイズの配列にされることができます.
あなたが制限された配列が固定配列から期待するすべてのメンバーをサポートすることを知って満足しているでしょう.
Assert.Equal(3, boundedArray[2]);
Assert.Equal(new[] { 1, 2, 3 }, boundedArray[0..2]);
Assert.Equal(5, boundedArray.Length);
など
では、なぜ固定配列の代わりに有界な配列を使うのですか?すべてが、制限された配列が提供するさらなる柔軟性に降ります.固定配列には単に存在しない操作を考えてください.
boundedArray.Remove(5); // Remove every 5
boundedArray.Remove((x) => x % 2 == 0); // Remove every even
// boundedArray is now: [1, 3]
boundedArray.Add(4);
// boundedArray is now: [1, 3, 4]
boundedArray.Insert(1, 2);
// boundedArray is now: [1, 2, 3, 4]
注意:配列が最大容量のときに要素を追加または挿入する場合は、例外を取得します!
Implicit(TElement[] to BoundedArray<TElement>) が異なるところは、それが連想的であるということです、そして、我々は現在、結果として既知のインデックスタイプを持っています.建設を検討する
public readonly BoundedArray<Char, String> boundedArray =
    new BoundedArray<Char, String>(5);
この例では、配列の初期化子を使用することができます. BoundedArray<TIndex, TElement> を呼び出して、同じ長さの2つの配列に結合することができます.
new BoundedArray<Char, String>(5) {
    ('a', "Alfa"),
    ('b', "Bravo"),
    ('c', "Charlie"),
    ('d', "Delta"),
    ('e', "Echo"),
};
そして、うまくいけば、私たちが明示的に(Char, String)[]タイプとパラメタを通過しているので、連想コレクションでそれが明白であることを望みます.
Assert.Equal("Bravo", boundedArray['b']);
Assert.Equal("Echo", boundedArray['e']);
Assert.Equal(null, boundedArray['f']); // Not in the collection, returns default
これは、Zip()またはインデックスとしてもう一つの整数型を使用するだけで、あなたが疎配列として連想変数を使うことができることを意味します!
制限された配列の強みは、かなりの程度の実装複雑さなしで、柔軟性のまともなレベルを提供します.実際には、実装はデータ構造の中の追加整数に依存しています.
制限された配列への欠点は、メモリの最大容量を常に使用します.あなたは選択を得ることはありません.潜在的に非常に大きく、非常に小さな配列が必要ですか?あなたは関係なく、それらのすべての最大容量を使用する必要があります.それは大丈夫であり、それは開発につながります.

tindexとint 32


信じているかどうかは、我々はすでに大きく表示される必要があるすべてのオフを示している.ダイナミックサイズの配列はどのように異なりますか?それは、それが内部的にしていることに降ります.容量を持つときに、要素を追加または挿入すると、制限されたサイズの配列が例外をスローしますが、動的なサイズ配列は非常に異なります.彼らは成長!この操作は非常に非効率的です、そして、あなたがサイズを大きく変えることになっているならば、他のより適切なコレクションがあります.しかし、より大きな容量を持つ新しい配列を作成し、要素をコピーし、内部参照をスワップしてから、古い配列を破棄することでこれを行う.すべては、あなたのために行わ!動的なサイズの配列は、それらのユースケースを持ち、内部的にはかなり使用されますが、一般的に言えば、リストやツリーが欲しいでしょう.サイズ変更が珍しいことであるということを知っているならば、ダイナミックな配列はちょうどあなたが必要とするものであるかもしれません.
これは完全で、準備ができて、データ構造である間、あなたが興味があるかもしれないより多くがあります;

DynamicArray < tElement >とDynamicArray < TIndex , Telement >


Collectathonはコレクションライブラリだけでなく、フレームワークでもありますので、フレームワークの種類がどのように動作するか、どのようにして追加の動作を追加するかについては、どのように使用することができます.これらのバリアントの両方で、それはちょうど若干の種類の配列であるタイプを越えてほとんど仮定しません.しかし、これはまだ前と逆の列挙子(yes、Collectathonは逆の列挙子をサポートするすべての型をサポートしています)、インデクサーとスライサー、等値メソッドと演算子、要素置換、シフト、およびその他のように、実装者にとってかなりの数のことを提供します.“配列のいくつかの種類”以外の何かを仮定することができないための非常に多くの機能性.
あなたがCRTPに慣れていないならば、そのArray<TElement, TSelf>パラメタはちょうど「私にあなたにものを提供するつもりであるので、私に実装タイプを渡します」と言っています.基本的に、それはあなたが自由のためのフレームワークからさらに得ることができます.
しかし、我々はさらに進むことができます!

array < tindex , telement , tself >とtself


有界でダイナミックな配列は、これから派生します.これは、“この配列を変更することができますが、私は制限とその仕組みを知らない”という仮定を追加します.
この仮定は、あなたが予想するかもしれないより多くを許します.要素の挿入、配列全体のクリア、キューおよびスタックの動作、および要素の削除、すべてが自動的に提供されます.実際、この時点でさえ、FlexibleArray<TElement, TSelf>だけが実装する必要があると定義されています.4メソッド!いいえ、真剣に!

コレクションフレームワークはその効果です.