退屈だったので、IEnumerable を使用して List の実装をゼロから作成することにしました。正直なところ、解決方法がわからないいくつかの問題に遭遇しました。
- インデックスが null またはデフォルト (T) に設定されている場合、ジェネリック配列 (T[]) のサイズをどのように変更しますか?
- T を null にすることはできないため、値がデフォルトで 0 である数値プリミティブの問題をどのように解決しますか?
- #2 に関して何もできない場合、数値データ型を使用しているときに GetEnumerator() メソッドが 0 を返すのをどのように停止しますか?
最後になりましたが、配列のダウンサイジングに関する標準的な方法は何ですか? アップサイジングの最善の解決策の 1 つは、現在の長さを 2 のべき乗で増やすことであることは確かです。縮小する場合、いつ縮小しますか? Remove/RemoveAtごと、または現在使用されている長さ% 2?
これまでに行ったことは次のとおりです。
public class List<T> : IEnumerable<T>
{
T[] list = new T[32];
int current;
public void Add(T item)
{
if (current + 1 > list.Length)
{
T[] temp = new T[list.Length * 2];
Array.Copy(list, temp, list.Length);
list = temp;
}
list[current] = item;
current++;
}
public void Remove(T item)
{
for (int i = 0; i < list.Length; i++)
if (list[i].Equals(item))
list[i] = default(T);
}
public void RemoveAt(int index)
{
list[index] = default(T);
}
public IEnumerator<T> GetEnumerator()
{
foreach (T item in list)
if (item != null && !item.Equals(default(T)))
yield return item;
}
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
{
foreach (T item in list)
if (item != null && !item.Equals(default(T)))
yield return item;
}
}
前もって感謝します。