1. 程式人生 > >C#泛型之List操作示例

C#泛型之List操作示例

轉自:http://blog.itpub.net/12639172/viewspace-478294/
private void button1_Click(object sender, EventArgs e)
        {
            label1.Text = "";
            /*
            ArrayList AL = new ArrayList(3);
            TestData temp = new TestData(1);
            AL.Add(temp);
            AL.Add(new TestData(2));
            AL.Add(new TestData(3));
            foreach (TestData item in AL)
            {
                label1.Text += item.Val.ToString() + "   ";
                item.Val += 1;
            }
            foreach (TestData item in AL)
            {
                label1.Text += item.Val.ToString() + "   ";
            }
             */
            List racers;
            List racers2;
            FindRacer finder;
            //--------------------------------------------------------------------------------
            //生成泛型物件
            racers = new List();
            racers.Add(new Racer("M J", "L"));
            racers.Add(new Racer("AD3 R", "OK3"));
            racers.Add(new Racer("M2 O", "L2"));
            racers.Add(new Racer("AD2 Q", "OK2"));
            racers.Add(new Racer("M1 W", "L"));
            racers.Add(new Racer("AD4 A", "OK4"));
            racers.Add(new Racer("AD1 L", "OK1"));
            
            //跌代顯示泛型物件所有元素
            label1.Text += "\n跌代顯示泛型物件所有元素\n";
            foreach (Racer item in racers)
            {
                label1.Text += item.ToString() + "   ";
            }
            //--------------------------------------------------------------------------------
            /*
            List查詢物件:Preadcate是一個委託,它引用一個謂詞方法.
            public T Find match);
            public List FindAll match);
            */
            //委託查詢所有滿足條件的元素
            label1.Text += "\nFindAll(Car==\"L\")\n";
            finder = new FindRacer("L");
            foreach(Racer item in racers.FindAll(new Predicate(finder.DrivingCarPredicate)))     
            {
                label1.Text += item.ToString() + "   ";
            }
            label1.Text += "\nFindAll(Car==\"L\")將結果賦給其它泛型物件\n";
            racers2 = racers.FindAll(new Predicate(finder.DrivingCarPredicate));//返回泛型物件
            foreach (Racer item in racers2)
            {
                label1.Text += item.ToString() + "   ";
            }
            //委託查詢一個元素(找到的第一個元素)
            label1.Text += "\nFind(Car==\"L\")\n";
            finder = new FindRacer("L2");
            label1.Text += racers.Find(new Predicate(finder.DrivingCarPredicate)).ToString();
            //將查找出的元素做修改
            racers.Find(new Predicate(finder.DrivingCarPredicate)).Car = "L";
            label1.Text += "\n將查找出元素修改過後\n";
            finder = new FindRacer("L");
            foreach (Racer item in racers.FindAll(new Predicate(finder.DrivingCarPredicate)))
            {
                label1.Text += item.ToString() + "   ";
            }
            //--------------------------------------------------------------------------------
            /*
            List.ForEach()可以用於對每個元素執行一些操作.
            它使用Action委託對集合中的每個元素執行操作.Action委託返回的型別是void.
            */
            racers.ForEach(delegate(Racer r) { r.Car += "_CAR"; });
            label1.Text += "\nList.ForEach()全部修改物件\n";
            foreach (Racer item in racers)
            {
                label1.Text += item.ToString() + "   ";
            }
            //--------------------------------------------------------------------------------
            /*
            List.Sort對元素進行排序
            */
            //public void List.Sort(Comparison), 是一個委託方法,該方法帶兩個T型別引數;
            racers.Sort(delegate(Racer r1, Racer r2) { return r1.Car.CompareTo(r2.Car); });
            label1.Text += "\n 排序public void List.Sort(Comparison)\n";
            foreach (Racer item in racers)
            {
                label1.Text += item.ToString() + "   ";
            }
            //public void List.Sort(IComparer)
            racers.Sort(new RacerComparer(RacerComparer.CompareType.Name));
            label1.Text += "\n 排序public void List.Sort(IComparer)\n";
            foreach (Racer item in racers)
            {
                label1.Text += item.ToString() + "   ";
            }
            //--------------------------------------------------------------------------------
            /*
            型別轉換
             */
            List persons = racers.ConvertAll(delegate(Racer r)
            {
                int ixSeparator = r.Name.LastIndexOf(' ') + 1;
                string lastname = r.Name.Substring(ixSeparator, r.Name.Length - ixSeparator);
                string firstname = r.Name.Substring(0, ixSeparator - 1);
                return(new Person(firstname, lastname));
            });
            label1.Text += "\n List.ConvertAll型別轉換\n";
            foreach (Person item in persons)
            {
                label1.Text += item.ToString() + "   ";
            }
            label1.Text += "\n 型別轉換後的源資料\n";
            foreach (Racer item in racers)
            {
                label1.Text += item.ToString() + "   ";
            }
            //--------------------------------------------------------------------------------
        }


//--------------------------------------------------------------------------------
    //實體類
    class Racer
    {
        private string name;
        public string Name
        {
            get
            {
                return (name);
            }
        }
        private string car;
        public string Car
        {
            get
            {
                return (car);
            }
            set
            {
                car = value;
            }
        }
        public Racer(string name, string car)
        {
            this.name = name;
            this.car = car;
        }
        public override string ToString()
        {
           return name + "," + car;
        }
    }
    //--------------------------------------------------------------------------------
    //查詢類
    class FindRacer
    {
        private string car;
        public FindRacer(string car)
        {
            this.car = car;
        }
        public bool DrivingCarPredicate(Racer racer)
        {
            return (racer.Car == car);
        }
    }
    //排序類
    class RacerComparer : IComparer
    {
        public enum CompareType
        {
            Name, Car
        }
        private CompareType compareType;
        public RacerComparer(CompareType compareType)
        {
            this.compareType = compareType;
        }
        public int Compare(Racer x, Racer y)
        {
            int result = 0;
            switch (compareType)
            {
                case CompareType.Name:
                    {
                        result = x.Name.CompareTo(y.Name);
                        break;
                    }
                case CompareType.Car:
                    {
                        result = x.Car.CompareTo(x.Car);
                        break;
                    }
            }
            return (result);
        }
    }
    //--------------------------------------------------------------------------------
    //型別轉換類
    public class Person
    {
        private string firstname;
        private string lastname;
        public Person(string firstname, string lastname)
        {
            this.firstname = firstname;
            this.lastname = lastname;
        }
        public override string ToString()
        {
            return (firstname + "." + lastname);
        }
    }