天天看點

c#自定義泛型清單

public class MyException:Exception

{

    public  MyException (string msg) : base (msg)

    {

    }

}

public class MyArrayList<T>

{

    T[] list;

    int capacity = 0;

    int count = 0;

    bool isFixedSize = false;

    public MyArrayList ()

    {

    }

    public MyArrayList (int capacity)

    {

        this.capacity = capacity;

        list = new T[capacity];

        isFixedSize = true;

    }

    public int Count {

        get{ return this.count; }

    }

    public int Capacity {

        get{ return capacity; }

    }

    public bool IsFixedSize ()

    {

        return isFixedSize;

    }

    //索引器

    public T this [int index] {

        get { 

            return list [index];

        }

        set {

            list [index] = value;

        }

    }

    public void Add (T value)

    {

        if (list == null) {

            list = new T[4];

            capacity = 4;

        } 

        if (count >= capacity) {

            T[] temp = list;

            list = new T[capacity *= 2];

            for (int i = 0; i < count; i++) {

                list [i] = temp [i];

            }

        } 

        list [count++] = value;

    }

    public void Sort ()

    {

        for (int i = 0; i < count; i++) {

            for (int j = 0; j < count - i - 1; j++) {

                if (list [i] is Person) {

                    IMyComparable obj1 = (IMyComparable)list [j];

                    IMyComparable obj2 = (IMyComparable)list [j + 1];

                    if (obj1.ComparaTo (obj2) > 0) {

                        T temp = list [j];

                        list [j] = list [j + 1];

                        list [j + 1] = temp;

                    }

                } else if (list [i] is IComparable) {

                    IComparable obj1 = (IComparable)list [j];

                    IComparable obj2 = (IComparable)list [j + 1];

                    if (obj1.CompareTo (obj2) > 0) {

                        T temp = list [j];

                        list [j] = list [j + 1];

                        list [j + 1] = temp;

                    }

                } else {

                    throw new MyException ("不能識别");

                }

            }

        }

    }

    public int BinarySearch (T obj)

    {

        if (obj is Person) {

            Person    value = (Person)(object)obj;

            if (count == 0 || value.Age < ((Person)(object)list [0]).Age) {

                return -1;

            }

            int start = 0;

            int end = list.Length;

            int middle = (start + end) / 2;

            while (start < end && (Person)(object)list [middle] != value) {

                if (((Person)(object)list [middle]).ComparaTo (value) < 0) {

                    start = middle + 1;

                }

                if (((Person)(object)list [middle]).ComparaTo (value) > 0) {

                    end = middle - 1;

                }

                middle = (start + end) / 2;

            }

            if ((Person)(object)list [middle] != value) {

                return -1;

            } else {

                return middle;

            }

        } else if (obj is IComparable) {

            IComparable    value = (IComparable)obj;

            if (count == 0 || value.CompareTo ((IComparable)list [0]) < 0) {

                return -1;

            }

            int start = 0;

            int end = list.Length;

            int middle = (start + end) / 2;

            while (start < end && (0 != value.CompareTo ((IComparable)list [middle]))) {

                if (value.CompareTo ((IComparable)list [middle]) > 0) {

                    start = middle + 1;

                }

                if (value.CompareTo ((IComparable)list [middle]) < 0) {

                    end = middle - 1;

                }

                middle = (start + end) / 2;

            }

            if (value.CompareTo ((IComparable)list [middle]) != 0) {

                return -1;

            } else {

                return middle;

            }

        }

        throw new MyException ("不能識别此類型");

    }

    public void Clear ()

    {

        count = 0;

        list = new T[capacity];

    }

    public bool Contains (T value)

    {

        foreach (T obj in list) {

            if ((object)obj == ((object)value)) {

                return true;

            }

        }

        return false;

    }

    public int IndexOf (T value)

    {

        int index = -1;

        for (int i = 0; i < count; i++) {

            T obj = list [i];

            if (obj.Equals (value)) {

                index = i;

            }

        }

        return index;

        ;

    }

    public void Insert (int index, T value)

    {

        if (index > count + 1) {

            throw new MyException ("下标超出範圍");

        }

        if (list == null) {

            capacity = 4;

        }

        if (count + 1 >= capacity) {

            capacity *= 2;

        }

        T[] temp = list;

        list = new T[capacity];

        if (temp != null) {

            for (int i = 0; i <= count; i++) {

                if (i < index) {

                    list [i] = temp [i];

                } 

                if (i == index) {        

                    list [i] = value;

                } 

                if (i > index) {

                    list [i] = temp [i - 1];

                }

            }

            count++;

        }

    }

    public void Remove (T value)

    {

        T[] temp = list;

        list = new T[capacity];

        int j = 0;

        bool isSucced = false;

        for (int i = 0; i < count; i++) {

            T obj = temp [i];

            if (obj.Equals (value) && isSucced == false) {

                isSucced = true;

            } else {

                list [j] = obj;

                j++;

            }

        }

        if (isSucced) {

            count--;

        } else {

            throw new MyException ("未找到要移除元素");

        }

    }

    public void RemoveAt (int index)

    {

        if (index >= count || index < 0) {

            throw new MyException ("下标超出索引範圍");

        }

        T[] temp = list;

        list = new T[capacity];

        int item = 0;

        for (int i = 0; i < count; i++) {

            if (i != index) {

                list [item] = temp [i];

                item++;

            }

        }

        count--;

    }

    public void Reverse ()

    {

        for (int i = 0; i < count / 2; i++) {

            T temp = list [i];

            list [i] = list [count - 1 - i];

            list [count - 1 - i] = temp;

        }

    }

    public T[] ToArray ()

    {

        T[] temp = new T[count];

        for (int i = 0; i < count; i++) {

            temp [i] = list [i];

        }

        return temp;

    }

    public override  string ToString ()

    {

        string str = "";

        if (count == 0) {

            return "{}";

        }

        for (int i = 0; i < count; i++) {

            if (i == 0) {

                str += ("{" + list [i] + ",");

            } else if (i == count - 1) {

                str += (list [i] + "}");

            } else {

                str += list [i] + ",";

            }

        }

        return String.Format ("{0} count{1} capacity{2}", str, count, capacity);

    }

    public void TrimToSize ()

    {

        if (capacity > count) {

            capacity = count;

        }

        T[] temp = list;

        list = new T[capacity];

        for (int i = 0; i < count; i++) {

            list [i] = temp [i];

        }

    }

}

public interface IMyComparable

{

    int ComparaTo (object obj);

}

public  class Person: IMyComparable

{

    int age;

    public int Age {

        get{ return age; }

        set{ age = value; }

    }

    public Person ()

    {

    }

    public Person (int age)

    {

        this.age = age;

    }

    public override string ToString ()

    {

        return string.Format ("[Person: Age={0}]", Age);

    }

    public    int ComparaTo (object obj)

    {

        if (obj is Person) {

            Person other = (Person)obj;

            if (age > other.age)

                return 1;

            else if (age < other.age)

                return -1;

            else if (age == other.age)

                return 0;

        }

        throw new MyException ("比較識别不是Person的類型");

    }

    public    static int Compara (object obj1, object obj2)

    {

        if (obj1 is Person && obj2 is Person) {

            Person p1 = (Person)obj1;

            Person p2 = (Person)obj2;

            if (p1.Age > p2.Age)

                return 1;

            else if (p1.Age < p2.Age)

                return -1;

            else if (p1.Age == p2.Age)

                return 0;    

        }

        throw new MyException ("比較識别不是Person的類型");

    }

}