数组的不足

我们在使用数组管理数据的时候,是需要预先知道数组的长度的。但是在我们实际的开发过程中,很多数据往往无法事先知道一共有多少,在面对这些数据的时候,就无法使用数组来进行管理了。

一、集合结构

C#中提供了一系列特殊功能的类,这些类可以存储任意类型的对象,并且长度是可变的,他们统称为集合。

在 C#编程语言中,集合结构有两种:泛型集合,非泛型集合。

泛型集合:只能存储固定类型的对象的一种集合。

要使用泛型集合,我们必须引入对应的命名空间:

System.Collections.Generic

二、List<T>介绍

List<T>是一个 C#内置的一个类,是类我们就可以实例化出对象,本质和数组一样,因为 List<T>这个类的内部其实是维护了一个数组。

但是 List<T>比数组灵活,这个类封装了很多方便我们操作这个内部数组的各种方法,我们可以方便的对数据进行增加,删除,修改等操作,且 List<T>的长度是可以动态改变的,在实例化 List<T>类型对象时,不需要指定长度。

三、List<T>基本使用

1.创建泛型集合
①首先引入命名空间:using System.Collections.Generic;
②List<类型> 集合名 = new List<类型>();

2.集合数据操作

①增加数据
集合名.Add(Value) //往集合中添加数据;
往集合中添加,数据会不断的添加到集合中,形成一种类似于排队的效果。

②查询数据
集合名[索引] //取出指定索引位置的数据;
List<T>的索引和数组一样,也是从 0 开始;
集合的长度可以通过“集合名.Count”这个属性来取得;

③删除数据
集合名.RemoveAt(索引) //删除指定索引位置的数据;
该索引位置的数据被删除后,该索引后面的数据的索引会自动被调整;

④修改数据
集合名[索引] = 新值; //给指定索引的的数据重新赋值;

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Diagnostics;

namespace one
{
    class Program
    {
        static void Main(string[] args)
        {
            //实例化一个集合
            List<int> num = new List<int>();
            num.Add(3);//往list里添加数据,类似于排队
            num.Add(2);
            num.Add(1);
            Console.WriteLine(num[0]);//查询元素,索引从0开始
            for (int i = 0; i < num.Count; i++)//循环访问
            {
                Console.WriteLine(num[i]);
            }
            num.Remove(2);//删除索引为2的值
            num[1] = 100;//修改数据
        }
    }
}

四、List<T>管理对象

直接上代码了。。。

主程序:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Diagnostics;

namespace one
{
    class Program
    {
        static void Main(string[] args)
        {
            //武器集合的定义
            List<Weapon> werpons = new List<Weapon>();
            //实例化一些武器
            Weapon item = new Weapon(1, "长虹剑", 100);
            werpons.Add(item);
            werpons.Add(new Weapon(2, "冰魄剑", 99));
            werpons.Add(new Weapon(2, "旋风剑", 98));
            werpons.Add(new Weapon(2, "奔雷剑", 97));

            //删除元素
            werpons.RemoveAt(1);//根据索引删除
            for(int i=0;i<werpons.Count;i++)//根据名字删除
            {
                if (werpons[i].Name == "旋风剑")
                    werpons.Remove(werpons[i]);
            }
            for (int i = 0; i < werpons.Count; i++)//查询显示list元素
            {
                Console.WriteLine(werpons[i]);
            }
        }
    }
}

Weapon类:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace one
{
    class Weapon
    {
        private int id;
        private string name;
        private int attack;

        public int Id
        {
            get { return id; }
            set { id = value; }
        }
        public string Name
        {
            get { return name; }
            set { name = value; }
        }
        public int Attack
        {
            get { return attack; }
            set { attack = value; }
        }

        public Weapon(int id,string name,int attack)
        {
            this.id = id;
            this.name = name;
            this.attack = attack;
        }
        public override string ToString()
        {
            return string.Format("id:{0}-name:{1}-attack:{2}", id, name, attack);
        }
    }
}