<转载>数组之外另一个选择:List<T>类

数组之外另一个选择:List<T>类

数组是一种数据结构,它包含若干相同类型的变量。


T[] arrayName;
T是任意可实例化的类型。这样声明了一个数组,其中所有元素都是T类型。这个数组变量arrayName则属于T[]类型,是一种引用类型。这是最普通的一维数组
 
举个例子:定义int数组并初始化,有如下三种方式:
int[] a=new int[5];
 
int[] a=new int[]{1,2,3,4,5};
 
int[] a={1,2,3,4,5};
 
其中第一种定义方法中所有的元素都为零,后两种都已显式指定。
数值型数组,如果不指定,初值为零;其他类型的数组初值为null
 
数组的元素类型既然是任意的,当然也可以是数组,这种情况叫做交错数组:
int a=new int[5][];
可以看成把a[5]当名称再次定义数组。
交错数组必须指定第一维的元素个数(此为5),即这个数组包含了几个数组。
a[0][0]可以获得其中第一个数组的第一个元素
a[0]可以获得第一个数组
a获得整个交错数组。
 
还有一种是多维数组
int[,] a=new int[2,3];
定义了两行三列的数组,多维数组是特殊的数组类型,与交错数组本质上是有区别的,虽然他们功能差不多。多维数组的每一个元素(在此)类型为int,而不是int[]。
 
当然你也可以混合使用多维和交错数组:
int[][,] a=new int[5][,];
这样的定义语法上也是没有错的。有些特殊的场合可能用得到,总之,数组的运用还是比较灵活的。
另外数组的维数也是没有限定的。
 
但你可能发现有时你必须指定它一共有多少元素。这样数组元素个数是有界限的,不能无限地添加,造成了一定的不便。针对非多维的数组,你有更好的选择List<T>类
 
上面简单地回顾了数组的内容。现在进入正文。本章主要介绍这个泛型类:List<T>类
表示可通过索引访问的对象的强类型列表。提供用于对列表进行搜索、排序和操作的方法。
它类似于数组,却更加方便,提供了很多方法,对列表进行操作。这是一种泛型类,可以看到后面更有尖括号,带类型参数T。下面具体讲讲他的用法。
 
比如可以定义int类型元素的列表:
List<int> a=new List<int>();
 
用这样的方式添加元素:
a.Add(1);
a.Add(2);
.....
 
也可以随时移除:
a.Remove(1);
a.Remove(2);
......
 
可以看出这样的操作方式根本没有个数的限制。可以任意添加或删除一个元素。
 
 
可以获得目前元素的个数:
a.Count
这是列表对象的一个属性。
更多操作方式见:
 
 
实例:
(本节假设您已学习了一个关于WinForm求平均值的实例)

  1. 打开这个项目。
  2. 编辑代码。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
 
namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        List<double> n = new List<double>();
        public Form1() { InitializeComponent(); }//初始化Form1
 
        private void Add_Click(object sender, EventArgs e)
        {
            try {
                 n.Add(double.Parse(textBox1.Text));//添加元素
                 textBox1.Text = string.Empty;//清空textBox1
            }
            catch (FormatException) { textBox1.Text = "类型错误"; }
        }
 
        private void Calc_Click(object sender, EventArgs e)
        {
            try { textBox1.Text = n.Average().ToString(); }
            catch (InvalidOperationException) { textBox1.Text = "没有数据"; }
        }
    }
}
 
由此可以看出代码量明显减少。(如果调试错误可能是控件没有指定正确的事件处理函数。参考:事件处理)
 
可以与原先的代码比较看看有什么区别:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
 
namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        double[] n=new double[256];
        public Form1()
        {
            InitializeComponent();//初始化Form1
            //for (int i = 0; i < n.Length; i++) n[i] = 0;//初始化数组
        }
 
        /// <summary>
        /// 用于获取n中第一个为0的项的索引
        /// </summary>
        /// <returns>返回需要的索引,找不到返回-1</returns>
        public int GetFreeIndex()
        {
            for (int i = 0; i < n.Length; i++) if (n[i] == 0) return i;
            return -1;
        }
 
        private void Add_Click(object sender, EventArgs e)
        {
            int i = GetFreeIndex();
            if (i >= 0)
            {
                n[i] = double.Parse(textBox1.Text);
                textBox1.Text = string.Empty;
            }
            else textBox1.Text = "数组空间不够了";
        }
 
        private void Calc_Click(object sender, EventArgs e)
        {
            /*
            double sum=0;
            int count=0;
            foreach (double d in n)
            {
                if (d != 0)
                {
                    sum += d;
                    count++;
                }
            }
            if (count != 0) textBox1.Text = (sum / count).ToString();
            else textBox1.Text = "没有数据输入";
            */
            try { textBox1.Text = n.Average().ToString(); }//与上被注释代码等效
            catch (InvalidOperationException) { textBox1.Text = "没有数据"; }
        }
    }
}
posted @ 2012-12-06 09:11  侠梦千年  阅读(422)  评论(0编辑  收藏  举报