(15)C#集合
http://blog.csdn.net/hcw_peter/article/details/3980723
集合分为非泛型集合和泛型集合 ,泛型集合可以指定放入集合中的类型。
一、非泛性集合
引用命名空间
using System.Collections;
ArrayList类
一个动态可变数组,
ArrayList aList = new ArrayList(); //将对象添加到 ArrayList 的结尾处 aList.Add("aaa"); aList.Add("bbb"); aList.Add("ddd"); aList.Add("eee"); //获取 ArrayList 中实际包含的元素数 Console.WriteLine("获取 ArrayList 中实际包含的元素数"); int i = aList.Count; Console.WriteLine("alist现有" + i + "个元素"); //通过索引下标获取元素值 Console.WriteLine("通过索引下标获取元素值"); object obj = aList[1]; Console.WriteLine(obj); //判断是否包含指定元素,返回布尔值 Console.WriteLine("判断是否包含指定元素,返回布尔值"); bool b = aList.Contains("aaa"); Console.WriteLine("是否包含此元素:"+b); //将元素插入到指定索引处 Console.WriteLine("将元素插入到指定索引处"); aList.Insert(2, "ccc"); Console.WriteLine(aList[1]); //遍历aList Console.WriteLine("遍历aList"); foreach (var a in aList) { Console.Write("遍历aList=" + a + ","); } Console.WriteLine(""); //将元素顺序反转 Console.WriteLine("将元素顺序反转"); aList.Reverse(); foreach (var a in aList) { Console.Write("遍历aList=" + a + ","); } Console.WriteLine(""); //将指定范围中的元素反转 Console.WriteLine("将指定范围中的元素反转,反转从1索引开始反转4个元素"); aList.Reverse(1, 4); foreach (var a in aList) { Console.Write("遍历aList=" + a + ","); } Console.WriteLine(""); //排序 Console.WriteLine("排序"); aList.Sort(); foreach (var a in aList) { Console.Write("遍历aList=" + a + ","); } Console.WriteLine(""); //移除指定元素,如果没有此元素不会报错 Console.WriteLine("移除指定元素,如果没有此元素不会报错"); aList.Remove("eee"); foreach (var a in aList) { Console.Write("遍历aList=" + a + ","); } Console.WriteLine(""); //移除指定下标元素 Console.WriteLine("移除指定下标元素"); aList.RemoveAt(0); foreach (var a in aList) { Console.Write("遍历aList=" + a + ","); } Console.WriteLine(""); //移除指定范围元素 Console.WriteLine("移除指定下标元素,从0索引开始移除1个元素"); aList.RemoveRange(0,1); foreach (var a in aList) { Console.Write("遍历aList=" + a + ","); } Console.WriteLine(""); //清除所有元素 aList.Clear(); Console.WriteLine("alist现有" + aList.Count + "个元素"); Console.ReadKey();
//从目标数组的开头开始,将整个 ArrayList 复制到兼容的一维 Array CopyTo(Array) //从目标数组的指定索引处开始将整个 ArrayList 复制到兼容的一维 Array CopyTo(Array, Int32)
Hashtable 类
存储一组键值对,同过键快速查找对应的值
//获取包含在 Hashtable 中的键/值对的数目 int count = htable.Count;
//从 Hashtable 中移除带有指定键的元素 htable.Remove(3);
//从 Hashtable 中移除所有元素。 htable.Clear();
//确定 Hashtable 是否包含特定键 bool b1=htable.Contains(3); //确定 Hashtable 是否包含特定键 bool b2=htable.ContainsKey(3);
//确定 Hashtable 是否包含特定值 bool b3=htable.ContainsValue("李");
//遍历htable.Keys,或者htable.Values foreach (object o in htable.Values) { Console.WriteLine(o); ; } //遍历哈希表只能用foreach来遍历,因为Hashtable不能用索引访问 foreach (DictionaryEntry ht in htable) { Console.WriteLine(ht.Key); //de.Key对应于keyvalue键值对key Console.WriteLine(ht.Value); //de.Key对应于keyvalue键值对value }
Queue
Queue队列就是先进先出。它并没有实现 IList,ICollection。所以它不能按索引访问元素,不能使用Add和Remove。下面是 Queue的一些方法和属性
Enqueue():在队列的末端添加元素
Dequeue():在队列的头部读取和删除一个元素,注意,这里读取元素的同时也删除了这个元素。如果队列中不再有任何元素。就抛出异常
Peek():在队列的头读取一个元素,但是不删除它
Count:返回队列中的元素个数
TrimExcess():重新设置队列的容量,因为调用Dequeue方法读取删除元素后不会重新设置队列的容量。
Contains():确定某个元素是否在队列中
CopyTo():把元素队列复制到一个已有的数组中
ToArray():返回一个包含元素的新数组
二、泛型集合
using System.Collections.Generic;
List<T> 类
(1)在决定使用IList<T> 还是使用ArrayList类(两者具有类似的功能)时,记住IList<T> 类在大多数情况下执行得更好并且是类型安全的。
(2)如果对IList<T> 类的类型 T 使用引用类型,则两个类的行为是完全相同的。但是,如果对类型 T 使用值类型,则需要考虑实现和装箱问题。
添加到ArrayList 中的任何引用或值类型都将隐式地向上强制转换为Object。如果项是值类型,则必须在将其添加到列表中时进行装箱操作,在检索时进行取消装箱操作。强制转换以及装箱和取消装箱操作都会降低性能;在必须对大型集合进行循环访问的情况下,装箱和取消装箱的影响非常明显。---微软
同arraylist
初始化赋值
class Program { static void Main(string[] args) { List<Student> stu1 = new List<Student> { new Student{ age=19,name="tom" }, new Student{ age=12,name="li" }, new Student{ age=15,name="meimei" }, }; } } class Student { public int age { get; set; } public string name { get; set; } }
list.AddRange(数组或a,b,c) 的方式添加多个元素,动态获取数据并存入时方便
Dictionary<TKey, TValue> 类
同 hashtable