C#基礎知識整理基礎知識(16)IListインタフェース——非汎用型
15001 ワード
ICollectionインタフェース、反復および汎用集合について詳しくは、IListインタフェースについて詳しく説明します.MSDNによってIListインタフェースは2種類あることがわかります:要素はobjectタイプのIListインタフェースで、異なるタイプのオブジェクト参照を置くことができます;IList汎用インタフェースは、指定したタイプのオブジェクト参照のみを格納できます.実際,IListとIListはベクトルとも呼ばれ,集合の長さを動的に変えることができ,集合の初期長を決定する必要がなく,集合は格納データの数に応じて自動的に変化するのが特徴である.IListとIListの継承関係が表示されます.
次に戻ってみると、IListとIListの違いは、以下のコードを見ると、ArrayListはIListを継承し、ListはIListを継承する.
これで分かります.一、IListインタフェース概要ILisインタフェースはICollectionインタフェースから継承され、以下の特性を備え、Count属性--集合要素の個数を取得する.GetEnumeratorメソッド--反復可能;CopyToメソッド:指定した要素を別の配列にコピーします.Clearメソッド--コレクション全体をクリアします.IListの新しいプロパティ、インデックスのプロパティ--インデックスに基づいてセット内の任意の要素にアクセスします.Addメソッド--集合の末尾に要素を追加する.Insertメソッド--集合の指定された位置に要素を挿入します.Removeメソッド-指定した要素を除去します.(RemoveAtを含む)Containsメソッド--オブジェクトが集合中であるか否かを判断する;IndexOfメソッド:指定したオブジェクトのセット内のインデックスの場所を検索します.また,IListインタフェースの集合は順番にエレメントを格納し,エレメントの格納順序は変更しない.2、アルゴリズムベクトルの集合は配列と同じで、すぐにアクセスする特徴を備えている.すなわち、アクセスベクトルのセットのいずれかのユニットにかかわらず、必要なアクセス時間は完全に同じである.ベクトルクラスでは、実際には通常の配列を使用して集合データを記録し、ベクトルクラスはいくつかのアルゴリズムテクニックを使用して、クラス全体が通常の配列とは異なる重要な特徴を対外的に表現します.配列の長さを動的に変更することができます.具体的なアルゴリズムは,内部配列が十分長い場合には直接追加と挿入操作を行い,内部配列長が不足している場合には,内部配列長に応じて新しい配列の長さを2倍に増やしてデータ移動(すなわち,配列配列を新しい配列に移動)を行う.ベクトルは、要素ストレージ領域を割り当てるときに冗長領域を多く割り当て、メモリ割り当て回数を最小限に抑えます.データ削除時には内部配列長は変化せず,削除されたデータを削除された後のデータで上書きするだけである.ただし、ベクトルは空間を割り当てるたびに冗長な空間を多く割り当てるため、メモリの圧力になります.そのため、プログラムで集中する回数の多いメモリの割り当てはできるだけ避けなければなりません.三、実装クラスIListとIListの実装クラスは、それぞれArrayListクラスとListクラスである.ArrayListクラスはSystemにある.Collectionネーミングスペースの下;ListクラスはSystemにある.Collection.Specializedネーミングスペースの下.四、実装コード(非汎用)
テストの呼び出し:
結果:
コードのダウンロード:http://download.csdn.net/detail/yysyangyangyangshan/4686479
[ComVisibleAttribute(true)] public interface IList : ICollection, IEnumerable public interface IList : ICollection, IEnumerable, IEnumerable
次に戻ってみると、IListとIListの違いは、以下のコードを見ると、ArrayListはIListを継承し、ListはIListを継承する.
public class IListClass { void test() { TestClass1 c1 = null; ArrayList arryList = new ArrayList(); arryList.Add(c1); List list = new List(); list.Add(c1); // TestClass1 getC1Array = arryList[0] as TestClass1;// TestClass1 getC1List = list[0];// , } } public class TestClass1 { }
これで分かります.一、IListインタフェース概要ILisインタフェースはICollectionインタフェースから継承され、以下の特性を備え、Count属性--集合要素の個数を取得する.GetEnumeratorメソッド--反復可能;CopyToメソッド:指定した要素を別の配列にコピーします.Clearメソッド--コレクション全体をクリアします.IListの新しいプロパティ、インデックスのプロパティ--インデックスに基づいてセット内の任意の要素にアクセスします.Addメソッド--集合の末尾に要素を追加する.Insertメソッド--集合の指定された位置に要素を挿入します.Removeメソッド-指定した要素を除去します.(RemoveAtを含む)Containsメソッド--オブジェクトが集合中であるか否かを判断する;IndexOfメソッド:指定したオブジェクトのセット内のインデックスの場所を検索します.また,IListインタフェースの集合は順番にエレメントを格納し,エレメントの格納順序は変更しない.2、アルゴリズムベクトルの集合は配列と同じで、すぐにアクセスする特徴を備えている.すなわち、アクセスベクトルのセットのいずれかのユニットにかかわらず、必要なアクセス時間は完全に同じである.ベクトルクラスでは、実際には通常の配列を使用して集合データを記録し、ベクトルクラスはいくつかのアルゴリズムテクニックを使用して、クラス全体が通常の配列とは異なる重要な特徴を対外的に表現します.配列の長さを動的に変更することができます.具体的なアルゴリズムは,内部配列が十分長い場合には直接追加と挿入操作を行い,内部配列長が不足している場合には,内部配列長に応じて新しい配列の長さを2倍に増やしてデータ移動(すなわち,配列配列を新しい配列に移動)を行う.ベクトルは、要素ストレージ領域を割り当てるときに冗長領域を多く割り当て、メモリ割り当て回数を最小限に抑えます.データ削除時には内部配列長は変化せず,削除されたデータを削除された後のデータで上書きするだけである.ただし、ベクトルは空間を割り当てるたびに冗長な空間を多く割り当てるため、メモリの圧力になります.そのため、プログラムで集中する回数の多いメモリの割り当てはできるだけ避けなければなりません.三、実装クラスIListとIListの実装クラスは、それぞれArrayListクラスとListクラスである.ArrayListクラスはSystemにある.Collectionネーミングスペースの下;ListクラスはSystemにある.Collection.Specializedネーミングスペースの下.四、実装コード(非汎用)
/// /// IList, /// public class ArrayList : IList { /// /// /// public struct Enumertor : IEnumerator { /// /// /// private int index; /// /// /// private ArrayList arrayList; /// /// /// /// public Enumertor(ArrayList arrayList) { this.arrayList = arrayList; this.index = -1; } /// /// , index /// public object Current { get { return arrayList[index]; } } /// /// , index , 1 1 /// /// public bool MoveNext() { if (this.index < arrayList.Count) { ++this.index; } return this.index < arrayList.Count; } /// /// , index -1 /// public void Reset() { this.index = -1; } } /// /// /// private object[] array = new object[1]; /// /// /// private int count; /// /// /// public ArrayList() { } /// /// , , /// /// public ArrayList(int capacity) { if (capacity < 0) { throw new Exception(); } if (capacity == 0) { capacity = 1; } this.array = new object[capacity]; this.count = 0; } public int Count { get { return this.count;// } } /// /// /// public int Capacity { get { return this.array.Length; } } /// /// /// public bool IsFixedSize { get { return false; } } /// /// /// public bool IsReadOnly { get { return false; } } /// /// , /// public bool IsSynchronized { get { return false; } } /// /// /// public object SyncRoot { get { return null; } } /// /// array , /// /// private object[] GetNewArray() { return new object[(this.array.Length + 1) * 2]; } public int Add(object value) { int newCount = this.count + 1; if (this.array.Length < newCount)// { object[] newArray = GetNewArray(); Array.Copy(this.array, newArray, this.count); this.array = newArray;// , } // this.array[this.count] = value; this.count = newCount; // return this.count - 1; } /// /// , /// /// /// public object this[int index] { get { if (index < 0 || index >= this.count) { throw new Exception(); } return this.array[index]; } set { if (index < 0 || index >= this.count) { throw new Exception(); } this.array[index] = value; } } /// /// /// /// /// public void RemoveRange(int index, int count) { if (index < 0) { throw new Exception(); } int removeIndex = index + count;// if (count < 0 || removeIndex > this.count) { throw new Exception(); } // Array.Copy(this.array, index + 1, this.array, index + count - 1, this.count - removeIndex); // this.count -= count; } /// /// , /// /// /// public int IndexOf(object value) { int index = 0; if (value == null) { while (index < this.count) { if (this.array[index] == null) { return index; } ++index; } } else { while (index < this.count) { if (this.array[index].Equals(value)) { return index; } ++index; } } return -1; } /// /// /// /// public void Remove(object value) { int index = this.IndexOf(value); if (index >= 0) { this.RemoveRange(index, 1); } } /// /// /// /// public void RemoveAt(int index) { RemoveRange(index, 1); } /// /// /// /// public object PopBack() { object obj = this.array[this.count - 1]; RemoveAt(this.count - 1); return obj; } /// /// /// /// public object PropFront() { object obj = this.array[0]; RemoveAt(0); return obj; } /// /// /// /// /// public void Insert(int index, object value) { if (index >= this.count) { throw new Exception(); } // 2 , 。 // , , 。 int newCount = this.count + 1; if (this.array.Length < newCount) { object[] newArray = GetNewArray(); Array.Copy(this.array, newArray, index); this.array = newArray; } Array.Copy(this.array, index, this.array, index + 1, this.count - index); this.array[index] = value; this.count = newCount; } /// /// /// /// /// public bool Contains(object value) { return this.IndexOf(value) >= 0; } /// /// /// public void TrimToSize() { // Add Insert , , 。 if (this.array.Length > this.count) { object[] newArray = null; if (this.count > 0) { newArray = new object[this.count]; Array.Copy(this.array, newArray, this.count); } else { newArray = new object[1]; } this.array = newArray; } } /// /// /// public void Clear() { this.count = 0; } /// /// /// /// public IEnumerator GetEnumerator() { Enumertor enumerator = new Enumertor(this); return enumerator; } /// /// /// /// /// public void CopyTo(Array targetArray, int index) { Array.Copy(this.array, 0, targetArray, index, this.count); } }
テストの呼び出し:
static void Main(string[] args) { // ArrayList myArrayList = new ArrayList(); myArrayList.Add(40); myArrayList.Add(80); myArrayList.Add("Hello"); // for for (int i = 0; i < myArrayList.Count; i++) { Console.WriteLine(myArrayList[i]); } Console.WriteLine("---------------------"); // foreach (object obj in myArrayList) { Console.WriteLine(obj); } Console.WriteLine("---------------------"); myArrayList.Insert(1, "Insert"); foreach (object obj in myArrayList) { Console.WriteLine(obj); } Console.WriteLine("---------------------"); myArrayList.Remove("Insert"); foreach (object obj in myArrayList) { Console.WriteLine(obj); } Console.WriteLine("---------------------"); myArrayList.RemoveAt(1); foreach (object obj in myArrayList) { Console.WriteLine(obj); } Console.WriteLine("---------------------"); myArrayList.Clear(); foreach (object obj in myArrayList) { Console.WriteLine(obj); } Console.WriteLine("---------------------"); Random rand = new Random(); for (int i = 0; i < 10; i++) { myArrayList.Add(rand.Next(10)); } foreach (object obj in myArrayList) { Console.WriteLine(obj); } Console.WriteLine("---------------------"); Console.WriteLine(" 1 ? " + (myArrayList.Contains(0) ? " " : " ")); Console.WriteLine(" 1 " + myArrayList.IndexOf(1)); Console.ReadLine(); }
結果:
コードのダウンロード:http://download.csdn.net/detail/yysyangyangyangshan/4686479