C#中的集合相关

来源:互联网 发布:c语言源文件 编辑:程序博客网 时间:2024/05/21 10:29

1、ArrayList:

构造函数:

ArrayList();初始化具有默认初始容量的新实例。

ArrayList(ICollection);把现有集合作为参数,将其内容复制到新实例中。

ArrayList(Int32);通过一个参数设置集合的容量,这个容量用一个int值指定,但这不是绝对的容量,如果集合中的项数超过了这个容量,容量会自动增加一倍。

代码如下:

ArrayList myal = new ArrayList(2);
            myal.Add("1");
            myal.Add("2");
            myal.Add("3");
            Console.WriteLine("长度:" + myal.Count + ";容量:" + myal.Capacity);
输出
:长度:3;容量:4

可以通过ArrayList的FixedSize(ArrayList)创建一个具有固定大小的ArrayList。如:

ArrayList myal2 = ArrayList.FixedSize(myal);
            Console.WriteLine("长度:" + myal2.Count + ";容量:" + myal2.Capacity);

输出:长度:3;容量:4

但是如果:myal2.Add("4"); 则会出现“System.NotSupportedException”异常,异常信息:“集合的大小是固定的。”


2、foreach循环和迭代器:

在foreach循环中,迭代一个collectionObject集合的过程如下:

(1)调用collectionObject.GetEnumerator(),返回一个IEnumerator引用。这个方法可以通过IEnumerable接口的实现代码来获得,但这是可选的。

(2)调用所返回的IEnumerator接口的MoveNext()方法。

(3)如果MoveNext()方法返回true,就使用IEnumerator接口的Current属性来获取对象的一个引用,用于foreach循环。

(4)重复前面两步(2,3),直到MoveNext()方法返回false为止,此时循环停止。

迭代器:迭代器是一个代码块,按顺序提供了要在foreach循环中使用的所有值。一般情况下是一个方法,但也可以使用属性访问器和其他代码块作为迭代器。

迭代器两种可能的返回类型是IEnumerator和IEnumerable,使用这两个类型的场合是:

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

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


3、浅度复制和深度复制:

可以使用受保护的方法System.Object.MemberwiseClone()进行浅度复制:

public class MyClass01

{

public int val;

}

public class MyClass02

{

public MyClass01 myclass=new MyClass01();

public MyClass02(int newVal)

{

myclass01.val=newVal;

}

public object GetValue()

{

return MemberwiseClone();

}

}

此时,通过GetValue()得到的浅度复制包括一个字段,它引用的对象与源对象相同。


.NET Framework 中实现深度复制的标准方式是实现ICloneable接口,该接口有一个Clone()方法,这个方法不带参数,返回一个object类型的结果:

public class MyClass01

{

public int val;

}

public class MyClass02 : ICloneable

{

public MyClass01 myclass=new MyClass01();

public MyClass02(int newVal)

{

myclass01.val=newVal;

}

public object Clone()

{

MyClass02 myclass02=new MyClass02(myclass.val);

return myclass02;

}

}

这次包含的对象是独立的。有时在比较复杂的对象系统中,调用Clone()是一个递归过程。

0 0
原创粉丝点击