C#集合先来了解下集合的基本信息1、BCL中集合类型分为泛型集合与非泛型集合。2、非泛型集合的类和接口位于System.Collections命名空间。3、泛型集合的类和接口位于System.Collections.Generic命名空间。 ICollection接口是Syst ...
C#集合
public class StringLengthComparer : IComparer<get='_blank'>string> { public int Compare(string s1, string s2) { if (s1.Length > s2.Length) { return (1); } else if (s1.Length < s2.Length) { return (2); } else { return (0); } } }
说完了集合接口,现在开始说集合。
1、ArrayList
ArrayList实现了IList、ICollection、IEnumerable接口。
ArrayList与Array的名字很相似,现在来比较一下两者的异同。
相同点:
(1)、两者都实现了IList、ICollection、IEnumerable接口。
(2)、两者都可以使用整数索引访问集合中的元素,包括读取和赋值,且集合中的索引都从0开始。
不同点:
(1)、ArrayList是集合,而Array是数组。
(2)、ArrayList是具体类,Array是抽象类。
(3)、数组必须在实例化时指定元素的数量,该数量一旦确定就不可以更改了,而ArrayList扩展了这一点,当实例化一个ArrayList实例时可以不指定集合元素数(有默认初始容量),当然你也可以指定初始容量。
(4)、获取数组的元素数时使用Length属性,而获取ArrayList集合的元素数时使用Count属性。
(5)、数组可以有多维,而ArrayList只能是一维。
来看ArrayList具体提供的功能
属性 说明
Capacity 获取或设置 ArrayList 可包含的元素数。
static void Main(string[] args) { ArrayList arrayList = new ArrayList(); arrayList.Add(1); //Add方法,将一个元素添加到ArrayList中 arrayList.Add("你好"); arrayList.Add(3.265); IList iList = arrayList; ICollection iCollection = iList; IEnumerable iEnumerable = iCollection; //体现了ArrayList的继承关系 foreach (object obj in iEnumerable) { Console.WriteLine(obj.ToString()); } bool b = arrayList.Contains("你好"); //确定ArrayList中是否包含某元素 Console.WriteLine(b); //输出 True object[] objArr = new object[arrayList.Count + 1]; objArr[0] = "我是用来占位的"; arrayList.CopyTo(objArr, 1); //便宜一位,也就是接受数组从1开始,默认是0 foreach (object obj in objArr) { Console.Write(obj.ToString() + "-"); //输出 我是用来占位的-1-你好-3.265- } Console.WriteLine(); ArrayList AL = ArrayList.FixedSize(arrayList); //静态方法 返回一个固定大小的ArrayList对象,数量不许改变。也就是说不能添加和删除。 Console.WriteLine(AL.IsFixedSize); //输出True //AL.Add(111); 此处报异常,"集合的大小是固定的" ArrayList ALReadOnly = ArrayList.ReadOnly(arrayList); Console.WriteLine(ALReadOnly.IsReadOnly); //输出True ArrayList AL1 = arrayList.GetRange(1, 2); //按照索引顺序截取出子集 foreach (object obj in AL1) { Console.Write(obj.ToString()); //输出 你好3.265 可以截取出的新ArrayList只包含1,2位 } Console.WriteLine(); int indexLocation = arrayList.IndexOf(1); //从左边开始检索,返回第一个匹配到的元素的顺序 Console.WriteLine(indexLocation); //输出 0 arrayList.Add(1); //为了体现LastIndexOf的不同,先添加一个1 int lastLocation = arrayList.LastIndexOf(1); Console.WriteLine(lastLocation); //返回3 arrayList.Insert(2, "Insert插入的元素"); //这个方法与Add的不同在于它可以在任意位置插入 foreach (object obj in arrayList) { Console.Write(obj.ToString() + " "); //输出 1 你好 Insert插入的元素 3.265 1 } ArrayList arr = new ArrayList(); arr.Add(1); arr.Add(2); arrayList.AddRange(arr); foreach (object obj in arrayList) { Console.Write(obj.ToString() + "-"); //输出 1 你好 Insert插入的元素 3.265 1 1 2可以看到将一个新的集合追加到了最后 } arrayList.Remove(2); foreach (object obj in arrayList) { Console.Write(obj.ToString() + "-"); //输出 1 你好 Insert插入的元素 3.265 1 1 可以看到2已经被移除了 } Console.WriteLine(); arrayList.RemoveAt(0); foreach (object obj in arrayList) { Console.Write(obj.ToString() + "-"); //输出 你好 Insert插入的元素 3.265 1 1 可以看到第0个元素"2"已经被移除了 } Console.WriteLine(); //arrayList.Reverse(); //foreach (object obj in arrayList) //{ // Console.Write(obj.ToString() + "-"); //输出顺序倒转的所有元素 //} ArrayList AL3 = new ArrayList(); arrayList.SetRange(0,AL3); //从第0位开始,将元素复制到AL3中 foreach (object obj in AL3) { Console.Write(obj.ToString() + "-"); //输出 你好 Insert插入的元素 3.265 1 1 } object[] objArrs = new object[arrayList.Count]; objArrs = arrayList.ToArray(); foreach (object obj in objArrs) { Console.Write(obj.ToString() + "-"); } Console.WriteLine(); arrayList.Capacity = 5; //读取或设置可包含元素的数量,如果小于当前会报错。 Console.WriteLine(arrayList.Count); //输出5 arrayList.TrimToSize(); Console.WriteLine(arrayList.Count); //输出5 Console.ReadKey(); }
2、非泛型集合HashTable
Hashtable实现了IDictionary、ICollection以及IEnumerable接口。注意Hashtable,t是小写的。由于是非泛型集合,因此存储进去的都是object类型,不管是键还是值。
Hashtable的要点。
(1)、Hashtable仅有非泛型版本。
(2)、Hashtable类中的键不允许重复,但值可以。
(3)、Hashtable类所存储的键值对中,值可以为null,但键不允许为null。
(4)、Hashtable不允许排序操作。
以下给出一个实例,Hashtable提供的功能是在于ArraryList差不多,只不过存储的是键值对而已。只写个基本短小的示例。
static void Main(string[] args) { Queue q = new Queue(); q.Enqueue(1); q.Enqueue("想家了!"); q.Enqueue(1.23); Console.WriteLine(q.Peek()); //输出1 获取值但不移除,与出列不同 int Count = q.Count; //出队的时候q.Count在变化,因此q.Count放在循环条件里是不妥的 for (int i = 0; i < Count; i++) { Console.WriteLine(q.Dequeue().ToString()); //注意 输出 1 想家了 1.23 都是从最先添加的先拿 } Console.WriteLine(q.Count); //输出0 出列一次,就自动移除了。 Queue<int> qInt = new Queue<int>(); qInt.Enqueue(1); qInt.Enqueue(2); qInt.Enqueue(3); Console.WriteLine(qInt.Peek()); //输出1 int IntCount = qInt.Count; for (int i = 0; i < IntCount; i++) { Console.WriteLine(qInt.Dequeue()); //注意 输出 123 都是从最先添加的先拿 } Console.WriteLine(q.Count); //输出0 出列一次,就自动移除了。 Console.ReadKey(); }
4、Stack和Stack<T>
Stack称为栈,栈和队列非常相似,只不过队列是先进先出,而栈中的数据添加和移除都在一端进行,遵守栈中的数据则后进先出。Stack类实现了ICollection和IEnumerable接口。
Stack类的一些重要特性如下:
1、后进先出。
2、可以添加null值到集合中。
3、允许集合中的元素重复。
4、Stack的容量会按需自动增加。
列出几个有特点的功能。
成员 类型 说明
Clear 方法 从Stack中移除所有对象
Contains 方法 确定某元素是否在Stack中
Push 方法 将对象插入Stack的顶部 入栈
Pop 方法 移除并返回Stack顶部的对象 出栈
Peek 方法 返回位于Stack顶部的对象,但不移除,注意出栈是移除的。它不移除仅仅返回。
Count 属性 获取Stack中包含的元素
static void Main(string[] args) { SortedList SL = new SortedList(); SL.Add("txt","txt"); //Add的时候会自动排序 SL.Add("jpg","jpg"); SL.Add("png","png"); foreach (DictionaryEntry de in SL) //返回的是DictionaryEntry对象 { Console.Write(de.Key + ":" + de.Value + " "); //输出 jpg:jpg png:png txt:txt //注意这个顺序啊,添加的时候就自动排序了 } Console.WriteLine(); SortedList<int,string> SLString = new SortedList<int,string>(); SLString.Add(3, "333"); SLString.Add(2, "222"); SLString.Add(1, "111"); foreach (KeyValuePair<int,string> des in SLString) //返回的是KeyValuePair,在学习的时候尽量少用var,起码要知道返回的是什么 { Console.Write(des.Key + ":" + des.Value + " "); } Console.ReadKey(); }
6、BitArray
BitArray类实现了一个位结构,它是一个二进制位(0和1)的集合。BitArray的值表示true或false。true表示位打开,false表示位关闭。BitArray实现了ICollection和IEnumerable接口。
BitArray的一些特性如下:
1、BitArray集合不支持动态调整,因此没有Add和Remove方法。
2、若需要调整集合的大小,可通过设置属性Length的值来实现。
3、集合中的索引从0开始。
4、使用BitArray(int length)构造函数初始化BitArray集合后,其值均为false。
5、BitArray集合之间支持按位“或”、“异或”、“与运算”,参与这三类运算的BitArray集合长度必须相等。否则会抛出异常。
抱着MSDN来学习下:
属性 说明
Count 获取 BitArray 中包含的元素数。
static void Main(string[] args) { BitArray BA = new BitArray(3); BA[0] = true; BA[1] = false; BA[2] = true; BitArray BB = new BitArray(3); BA[0] = true; BA[1] = false; BA[2] = true; BitArray BOr = BA.Or(BB); //与运算,返回一个新的BitArray foreach (var b in BOr) { Console.Write(b + "-"); //True-False-True } Console.ReadKey(); }
原标题:C# 集合 转载
关键词:C#
*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们:
admin#shaoqun.com
(#换成@)。