IList<T>

IList<T>は、ジェネリクス版のIList。

https://docs.microsoft.com/ja-jp/dotnet/api/system.collections.generic.ilist-1?view=netframework-4.8

List<T>インスタンスをIList<T>に突っ込んでみる。

List<T>がIList<T>を継承してるから当然だが。

i = 1
i = 2
i = 3
i = 4
i = 5
-----
iiList[0] = 1
iiList[1] = 2
iiList[2] = 3
iiList[3] = 4
iiList[4] = 5
続行するには何かキーを押してください . . .

IList<T>でもアクセスできる。

Sample/dotnet/IList_T/IList_T/src/IList_T_ at master · bg1bgst333/Sample · GitHub

List<T>

List<T>は、ジェネリクスで型を指定できるリスト。
(ArrayListジェネリクス版に相当する。)

https://docs.microsoft.com/ja-jp/dotnet/api/system.collections.generic.list-1?view=netframework-4.8

ArrayListではObject型にキャストしてアクセスしていたが、List<T>は宣言時に要素の型が決まるので不要である。

数値、文字列を添字やforeachでアクセス。
Object型は一切出てこない。

iList[0] = 1
iList[1] = 2
iList[2] = 3
iList[3] = 4
iList[4] = 5
-----
i = 1
i = 2
i = 3
i = 4
i = 5
-----
strList[0] = A
strList[1] = B
strList[2] = C
strList[3] = D
strList[4] = E
-----
str = A
str = B
str = C
str = D
str = E
続行するには何かキーを押してください . . .

アクセスできる。

Sample/dotnet/List_T/List_T/src/List_T_ at master · bg1bgst333/Sample · GitHub

IList

IListは、リストの定義を満たすための要件が定義されているインターフェース。

IList Interface (System.Collections) | Microsoft Docs

ここからは継承して実装するのも大変なので使い方を簡単に。

ArrayListはIListを継承してるので、

s = A
s = B
s = C
s = D
s = E
-----
iList[0] = A
iList[1] = B
iList[2] = C
iList[3] = D
iList[4] = E
続行するには何かキーを押してください . . .

iListからforeachでも添字でもアクセスできる。

Sample/dotnet/IList/IList/src/IList_ at master · bg1bgst333/Sample · GitHub

ICollection<T>

ICollection<T>は、ジェネリクス版のICollection。

https://docs.microsoft.com/ja-jp/dotnet/api/system.collections.generic.icollection-1?view=netframework-4.8

IEnumerable<T>を継承している。

追加の機能だけ実装する。
Addで1大きいサイズの配列を生成して、それに入れ替えて、要素もそこにセットするようにする。
それ以外は動けばいいので適当に実装。

testCollection.Addで追加できるか。

value = A
value = B
value = C
value = D
value = E
-----
value = A
value = B
value = C
value = D
value = E
value = F
続行するには何かキーを押してください . . .

追加できた。

Sample/dotnet/ICollection_T/ICollection_T/src/ICollection_T_ at master · bg1bgst333/Sample · GitHub

IEnumerator<T>

IEnumerator<T>は、ジェネリクス版のIEnumerator。

https://docs.microsoft.com/ja-jp/dotnet/api/system.collections.generic.ienumerator-1?view=netframework-4.8

<T>のないIEnumeratorとIDisposableの各メンバを実装しないといけない。

TestEnumeratorのコンストラクタで配列を受け取り、こちらのメンバで操作していく。
Tを返すCurrentでindex-1番目を返す。IEnumerator.Currentは実装してるが、使ってない。
あとは基底のメンバを実装。

TestCollectionのコンストラクタでTの配列を渡してTestEnumeratorを使っている。

今度は5つの文字列をセット。

IEnumerator<T> GetEnumerator()
MoveNext, index = 0
IEnumerator<T>:index = 0, Current = A
value = A
MoveNext, index = 1
IEnumerator<T>:index = 1, Current = B
value = B
MoveNext, index = 2
IEnumerator<T>:index = 2, Current = C
value = C
MoveNext, index = 3
IEnumerator<T>:index = 3, Current = D
value = D
MoveNext, index = 4
IEnumerator<T>:index = 4, Current = E
value = E
続行するには何かキーを押してください . . .

MoveNext, IEnumerator<T>のCurrentなどが呼ばれているのがわかる。

Sample/dotnet/IEnumerator_T/IEnumerator_T/src/IEnumerator_T_ at master · bg1bgst333/Sample · GitHub

IEnumerable<T>

IEnumerable<T>は、ジェネリクス版のIEnumerable。
C#ジェネリクスが登場してからは<T>のないIEnumerableを使うことはあまりないだろう。

https://docs.microsoft.com/ja-jp/dotnet/api/system.collections.generic.ienumerable-1?view=netframework-4.8

  • 自分のメソッドである「戻り値がIEnumerator<T>のGetEnumerator()」
  • 基底インターフェースとなるIEnumerableが持っている「戻り値がIEnumeratorのGetEnumerator()」

この2つを実装しないといけないのが問題。
引数同じ、戻り値違うとなると、オーバーロードじゃないし・・・。

ジェネリクスのほうは、IEnumerable.GetEnumeratorとするとビルド通った。
ジェネリクスのほうは、yield使った。
Setでi番目にT型の値をセットするような仕組みに・・・。

10から14までセット。

value = 10
value = 11
value = 12
value = 13
value = 14
続行するには何かキーを押してください . . .

なんとか動いた。

Sample/dotnet/IEnumerable_T/IEnumerable_T/src/IEnumerable_T_ at master · bg1bgst333/Sample · GitHub

ICollection

ICollectionは、コレクションの定義を満たすための必須の要件が定義されているインターフェース。

ICollection Interface (System.Collections) | Microsoft Docs
コレクション概要 - アルゴリズムとデータ構造 | ++C++; // 未確認飛行 C
C# のコレクション使用法のガイドライン その2 コレクション - Qiita

といっても、同期とコピーのインターフェースはめんどいので、今回まともに実装するのはサイズであるCountぐらいかな。

コンストラクタで内部でint型配列を生成しておいて、countに指定されたサイズをセットしておく。
また、各要素に0からcount - 1まで値をセットしておく。

サイズを最初に指定するコレクションTestCollection。

Count = 5
i = 0
i = 1
i = 2
i = 3
i = 4
続行するには何かキーを押してください . . .

foreachは機能するし、countの取得専用プロパティCountも機能している。

Sample/dotnet/ICollection/ICollection/src/ICollection_ at master · bg1bgst333/Sample · GitHub