<转载>数组之外另一个选择: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求平均值的实例)
- 打开这个项目。
- 编辑代码。
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 = "没有数据"; }
}
}
}