C#集合有哪些

集合(Collection)类是专门用于数据存储和检索的类。这些类提供了对栈(stack)、队列(queue)、列表(list)和哈希表(hash table)的支持。大多数集合类实现了相同的接口。

  1. ArrayList集合
  2. 1,ArrayList集合定义数组时,不需要初始化其大小:

    例: ArrayList animalArrayList = new ArrayList();

    但,使用array方法定义数组时:

    Animal[] animalArrayList2 = new Animal[5];

    2.ArrayList的.Add()方法给数组添加新项。

    3,ArrayList也支持foreach。

    4,ArrayList数组中输出元素的个数用.count

    普通数组使用.length

    5,.RemoveAt([index])可用于删除集合中的索引项多代表的对象

    .Remove([对象名])直接删除集合中的对象。

    当删除完某个对象(或对应索引时),后面的所有对象会向前移动一位

    6,.AddRange([项]),用于ArrayList添加项。此项可以接受ICollection接口的任何对象,包括数组。

            ArrayList list = new ArrayList();
           //添加单个元素
           list.Add(true);
           list.Add(1);
           list.Add("张三");
           list.Clear();清空所有元素
           list.Remove(true);删除单个元素 写谁就删出谁
           list.RemoveAt(0);根据下标去删除元素
           list.RemoveRange(0, 3);根据下标去移除一定范围的元素
           list.Insert(1, "插入的");在指定的位置插入一个元素
           bool b = list.Contains(1);判断是否包含某个指定的元素
           list.Add("大男孩");
           if (!list.Contains("大男孩"))
           {
                list.Add("大男孩");
            }else{
                Console.WriteLine("已经有了");
             }

              //循环打印
             for (int i = 0; i < list.Count; i++)
            {
                Console.WriteLine(list[i]);
            }
            list.Sort();//升序排列
            list.Reverse();反转

1、添加同一对象

using System.Collections.Generic;

public class Test(){

User u1 = new User ();

        u1.Id = 101;

        u1.Name = "张三";

        User u2 = new User();

        u2.Id = 102;

        u2.Name = "李四";

       

        ArrayList list = new ArrayList();

        list.Add(u1);

        list.Add(u2);

        foreach(User u in list)

{

            Debug.Log(u.Id + "\t" + u.Name);

         }  

}

2、添加多个不同对象

ArrayList list = new ArrayList();

User u=new User();

u1.Id = 101;

         u1.Name = "张三";

Student s=new Student();

s.Id = 101;

         s.Name = "李四";

list.Add(u);

list.Add(s);

foreach (object obj in list)

        {

            if (obj is Student)

            {

                Debug.Log("AAA");

            }

            if (obj is User)

            {

                Debug.Log("BBB");

            }

     }

IEnumerator :迭代器   [i'nju:mə,reitə]

IEnumerator it = list.GetEnumerator();

            while(it.MoveNext()){

                User u = (User)it.Current;

                it.MoveNext();

                Student s=(Student)it.Current;

                Console.WriteLine(u.Name+"\t"+s.Name);

            }

3、模板:template

    class Chinese

    {

        string name;

        int age;

    }

    class American

    {

        string name;

        int age;

    }

    class Person<T>

    {

        T name;

        T age;

    }

    class Test

    {

        static void Main(string[] args)

        {

                    Person<Chinese> chinese = new Person<Chinese>();

              Person<American> american = new Person<American>();

        }

     }

4、泛型

泛型是程序设计语言的一种特性,允许程序员在强类型程序设计语言中编写代码时定义一些可变部分,那些部分在使用前必须作出指明。

在应用程序中存储数据最简单的容器是数组,但无法满足数据的动态伸缩,为了摆脱这些数组的限制,.net基础类库发布了很多包含集合类的命名空间,集合类的尺寸是动态的,可以在运行时插入或者移除数据项,集合类包括两类:

1.非泛型集合:

主要位于System.Collections命名空间,包括ArraryList,BitArray,Stack,Queue等类,同时System.Collections.Specialized下的ListDictionary等类以及一些接口。

非泛型集合存在的问题:

1)性能问题:.Net支持两大数据类型:值类型和引用类型,有时候需要用某个类别的变量表示另外一个类别的变量,c#提供了装箱的机制将值类型的数据保存在引用类型中,装箱的实际定义为CLR会在堆上分配新的对象,将值类型的值赋予新的实例,并返回新的对象的引用。相反的操作为拆箱,拆箱是将保存在对象引用上的值转换回栈上相应的值类型,CLR会验证收到的值类型是否是装箱的值类型,如果是就将值赋值回本地值类型,如果不是则抛出异常。尽管装箱和拆箱都很方便,但带来的栈/堆内存的转移会导致性能问题。

2)类型安全问题

除了拆箱的时候我们需要记住装箱的值类型,还需要类型安全的容器来操作某些特定的数据类型,在引入泛型之前,需要通过手工创建强类型的集合类。

2.泛型集合

使用泛型集合可以解决上面的问题,包括性能的损失,泛型更类型安全,以及无需手工创建强类型的集合类,只需使用泛型集合并制定类型。

List<string> list = new List<string>();

            list.Add("张三");

            list.Add("李四");

            list.Add("王五");

            list.Add("田六");

            list.Add("赵七");

            for (int i = 0; i < list.Count; i++)

            {

                Console.WriteLine("for循环:" + list[i]);

            }

            list.RemoveAt(0);

            foreach (string item in list)

            {

                Console.WriteLine("foreach迭代:" + item);

            }

后进先出

            Stack<int> s = new Stack<int>();

            s.Push(1);

            s.Push(2);

            s.Push(3);

            s.Push(4);

            //Console.WriteLine(s.Peek());

           // Console.WriteLine(s.Pop());

            foreach (var item in s)

            {

                Console.WriteLine(item);

        }

  1. 队列

先进先出

Queue<int> q = new Queue<int>();

            q.Enqueue(1);

            q.Enqueue(2);

            q.Enqueue(3);

            q.Enqueue(4);

            //Console.WriteLine(q.Peek());

            //Console.WriteLine(q.Dequeue());

            foreach (var item in q)

            {

                Console.WriteLine(item);

        }

  1. 字典

无序字典

Dictionary<int, string> d = new Dictionary<int, string>();

            d.Add(1, "a");

            d.Add(3, "c");

            d.Add(4, "d");

            d.Add(2, "b");

            foreach (var item in d.Keys)

            {

                Console.WriteLine(item+"\t"+d[item]);

        }

有序字典

SortedDictionary<int, string> d = new SortedDictionary<int, string>();

            d.Add(1, "a");

            d.Add(3, "c");

            d.Add(4, "d");

            d.Add(2, "b");

//正序

            foreach (var item in d.Keys)

            {

                Console.WriteLine(item + "\t" + d[item]);

        }

        //倒序

            foreach (var item in d.Reverse())

            {

                Console.WriteLine(item.Key + "\t" + item.Value);

            }

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值