C#—集合类定义

数组的大小是固定不变的,而类System.Collections.ArrayList可用于表示大小可变的项列表。

public abstract class Animal
{
    protected string name;
    public string Name
    {
        get
        {
            return name;
        }
        set
        {
            name = value;
        }
    }
    public Animal()
    {
        name = "The animal with no name";
    }
    public Animal(string newName)
    {
        name = newName;
    }
    public void Feed()
    {
        Console.WriteLine("{0} has been fed.", name);
    }
}
public class Cow : Animal
{
    public void Milk()
    {
        Console.WriteLine("{0} has been milked.", name);
    }
    public Cow(string newName)
        : base(newName)
    {
    }
}
public class Chicken : Animal
{
    public Chicken(string newName)
        : base(newName)
    {
    }
    public void LayEgg()
    {
        Console.WriteLine("{0} has laid an egg.", name);
    }
}
使用集合类的例子是:

using System.Collections;
ArrayList animalList = new ArrayList();
Cow myCow = new Cow("Hayley");
animalList.Add(myCow);
animalList.Add(new Chicken("Roy"));
foreach (Animal temp in animalList)
    Console.WriteLine("{0} object," + "name = {1}", temp.ToString(), temp.Name);

ArrayList集合还可使用Remove()和RemoveAt()等方法。

也可通过下标访问,但ArrayList集合是System.Object对象的集合,必须进行数据类型转换,如((Chicken)animalist[1]).LayEgg();而简单数组是强类型化的,不必如此。

创建强类型化的集合:

public class Animals : CollectionBase

{

       public Animals()

       {

       }

       public void Add(Animal newAnimal)

       {

              List.Add(newAnimal);

       }

       public void Remove(Animal oldAnimal)

       {

              List.Remove(oldAnimal);

       }

       //索引符

       public Animal this[int index]

       {

              get

              {

                     return (Animal) List[index];

              }

              set

              {

                     List[index] = value;

              }

       }

}

对Animals可正常使用foreach循环。

CollectionBase提供受保护的属性List和InnerList,List可通过IList接口访问项,InnerList用于存储项的ArrayList对象。

键控集合

       允许项通过键值(如字符串名)进行索引。

       public class Animals : DictionaryBase

       {

              public Animals()

              {

              }

              public void Add(string id, AnimalnewAnimal)

              {

                     Dictionary.Add(id, newAnimal);

              }

              public void Remove(string id)

              {

                     Dictionary.Remove(id);

              }

              public Animal this[string id]

              {

                     get

                     {

                            return (Animal) Dictionary[id];

                     }

                     set

                     {

                            Dictionary[id] = value;

                     }

              }

       }

       其foreach需使用DictionaryEntry结构,要得到Animal对象本身必须使用这个结构的Value成员,也可使用结构的Key成员得到相关的键:

       foreach (DictionaryEntry myEntry in animalDictionary)

       {

              Console.WriteLine("{0} object,"+ "name = {1}", myEntry.Value.ToString(), ((Animal) myEntry.Value).Name);

       }

迭代器

       使用迭代器,可以按顺序提供要在foreach循环中使用的所有值。使用关键字yield

       1.如果要迭代一个类,可使用方法GetEnumerator(),其返回类型是IEnumerator。

       2.如果要迭代一个类成员,例如一个方法,则使用IEnumerable。

简单示例:

public static IEnumerable SimpleList()

{

       yield return “string 1”;

       yield return “string 2”;

       yield return “string 3”;

}

static void Main(string[] args)

{

       foreach(string item in SimpleList())

              Console.WriteLine(item);

}

在键控集合中添加简单迭代器:

public class Animals : DictionaryBase

{

       ……

       public new IEnumerator GetEnumerator()

       {

              foreach(object animal in Dictionary.Values)

                     yield return (Animal)animal;

       }

}

foreach循环就可与平常用法类似:

foreach(Animal myAnimal in animalDictionary)

{

       Console.WriteLine("{0} object,"+ "name = {1}", myAnimal.ToString(), myAnimal.Name);

}

浅度复制

       通过GetCopy()和MemberwiseClone()方法进行浅度复制,在类中添加如下代码:

       public object GetCopy()

       {

              return MemberwiseClone();

       }

深度赋值

       实现ICloneable接口的Clone()方法,如:

       public class Content

       {

              public int Val;

       }

       public class MyClass : ICloneable

       {

              public Content MyContent = new Content();

              public MyClass(int newVal)

              {

                     MyContent.Val = newVal;

              }

              public object Clone()

              {

                     MyClass clonedMyClass = newMyClass(MyContent.Val);

                     return clonedMyClass;

              }

       }

若MyContent字段也需要深度复制,则

       public object Clone()

       {

              MyClass clonedMyClass = newMyClass();

              clonedMyClass. MyContent = MyContent.Clone();

              return clonedMyClass;

       }

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值