您的位置:首页 > 编程语言 > C#

C#中的集合

2016-03-19 12:59 423 查看
ArrayList(不是集合) 和 List<T> (这个是集合) 使用Cast函数互转
ArrayList al = new ArrayList();

al.AddRange(new[] { 1, 5, 9 });

List<int> list = al.Cast<int>().ToList();    // cast是IE<T>的扩展方法,ToList()方法将IE<T>转换为List<T>集合


[/code]重要语句:实现了IList<T>接口可以实现索引,实现了IEnumerable接口可以实现迭代(用foreach循环)

Queue<T>和Queue

Queue<T>和Queue是先进先出(FIFO)的数据结构,通过Enqueue和Dequeue方法实现添加元素到队列的尾部和从队列的头部移除元素。Peek方法从队列的头部获取一个元素(不移除该元素),Count属性用来统计队列中元素的个数(在执行出列操作时检查元素是否存在非常有用)。尽管队列是可遍历的,但是它们并没有实现IList<T>接口和IList接口,因此也不能通过索引来访问队列中的元素。虽然也提供了ToArray方法,但是在复制元素时是从队列中随机读取的。

    Queue qq = new Queue();

    qq.Enqueue(10);

    qq.Enqueue(22);

    Console.WriteLine(qq.Count);  

    Console.WriteLine(qq.Peek());       //  弹出第一个数组元素

    Console.WriteLine(qq.Dequeue());    //  从queue头移除对象

    Console.WriteLine(qq.Peek());       //  返回第一个元素但不移除

    var i = qq.ToArray();       //  返回的是object[] 数组

    Console.WriteLine(i.GetType());

    Console.ReadKey();

[/code]

Stack<T>和Stack

Stack<T>和Stack则是后进先出的数据结构,通过Push和Pop法实现添加元素到队列的顶部和从队列的顶部移除元素。同样也提供了Peek方法、Count属性和ToArray方法

    Stack ss = new Stack();

    ss.Push(1);

    ss.Push(2);

    ss.Push("jingya");

    Console.WriteLine(ss.Count);

    Console.WriteLine(ss.Peek());

    ss.Pop();

    Console.WriteLine(ss.Peek());

    Console.ReadKey();

[/code]

BitArray

BitArray是一个都bool值组成的、大小可动态变化的集合。它比bool[]或List<bool>有更多的内存效率,这是因为每个元素都值占用一bit的内存空间,而bool类型则占用1byte空间(1byte=8bit)。通过索引器可以读取和更改BitArray元素的值。BitArray提供了四个位运算(Add, Or, Xor和Not)。最后最后一个方法之外,其他的三个方法接收另外一个BitArray,与 或 异或 非 的功能能实现非常复杂的逻辑运算的操作
    BitArray array1 = new BitArray(new[] { true, false, false, true, true });

    BitArray array2 = new BitArray(new[] { true, false, true, false, false });


    Console.WriteLine("--Or--");

    foreach (bool b in array1.Or(array2))

    Console.WriteLine(b);


    array1 = new BitArray(new[] { true, false, false, true, true });

    array2 = new BitArray(new[] { true, false, true, false, false });


    Console.WriteLine("\n--And--");

    foreach (bool b in array1.And(array2))

    Console.WriteLine(b);


    array1 = new BitArray(new[] { true, false, false, true, true });

    array2 = new BitArray(new[] { true, false, true, false, false });


    Console.WriteLine("\n--Xor--");

    foreach (bool b in array1.Xor(array2))

    Console.WriteLine(b);


    Console.ReadLine();

[/code]

HasSet<T>和SortedSet<T>

HashSet<T>在Framework3.5才新增的,而SortedSet<T>是Framework4.0新增的。两者都有下面的特性

基于哈希的查询使得Contains执行非常快速
两个集合都不存储重复的元素,如果试图添加重复元素会自动忽略
不能通过位置(索引)获取元素
SortedSet<T>的元素是排过序的,而HashSet<T>的元素未排序。

    int[] ii = { 1, 1, 7, 4, 3, 2, 1, 3, 2, 3, 4, 5, 6, 7, 7, 8 ,45, 1 };

    HashSet<int> set = new HashSet<int>();

    foreach (var item in ii)

    {

set.Add(item);

    }

    Console.WriteLine(set.Count());    //  统计出不重复的数字有多少个

    foreach (var item in set)

    {

Console.Write("  "+item);

    }

    SortedSet<int> sort_set = new SortedSet<int>();   // 这个自动在内部排序,输出是从小到大的排列

    foreach (var item in ii)

    {

sort_set.Add(item);

    }

    foreach (var item in sort_set)

    {

Console.Write("   "+ item);    

    }

    Console.ReadKey();

[/code]

来自为知笔记(Wiz)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: