某人

此前素未谋面、此后遥遥无期

0%

c#中的数组与集合

得到想要的

数据的简单与复杂,我已经无法理解了

在生活中经常处理数据,不管用什么方法,方式,我们都希望:容易、高效、简单,就是想方便,就是想做很少的事情,把我们的目的达到,得到我们想要的东西。

废话多了。。。

数组(Array)

数组是一个存储相同类型元素的固定大小的顺序集合。

声明数组:type[] arrayName;

数组的特点:

  1. 数组大小固定,不能伸缩
  2. 数值数组元素的默认值设置为零,而引用元素的默认值设置为 null
  3. 数组的索引从零开始
  4. 数组可读可写
  5. 数组要声明元素的类型

看一些简单的使用:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
eg:例子1
int[] a = new int[20];定义int数组
a [2] = 100;
Debug.Log (a[2]); //返回 100
Debug.Log (a[5]); //返回 0

eg:例子2
string[] numbers = new string[10];
numbers[2] = "a";
numbers[3] = "b";
Debug.Log (numbers[0]); //返回 null
Debug.Log (numbers[2]); //返回 a
Debug.Log (numbers[5]); //返回 null

eg:例子3
string[] numbers = new string[]{"a","b","c"};
Debug.Log (numbers[2]); //返回 c
Debug.Log (numbers[5]); //返回 引起错误

eg:例子4
string[] numbers = new string[]{"a","b","c"};
Debug.Log (numbers[2]); //返回 c
Debug.Log (numbers[5]); //返回 引起错误

eg:例子5
string[] numbers = {"a","b","c"};
Debug.Log (numbers[0]); //返回 a

集合(Collection)

集合(Collection)类是专门用于数据存储和检索的类。这些类有:
动态数组(ArrayList)、列表(List)、字典(Dictionary)、哈希表(Hashtable)、堆栈(Stack)、队列(Queue)、点阵列(BitArray);

动态数组(ArrayList)

动态数组(ArrayList)代表了可被单独索引的对象的有序集合。
与数组不同的是,您可以使用索引在指定的位置添加和移除项目,动态数组会自动重新调整它的大小。它也允许在列表中进行动态内存分配、增加、搜索、排序各项。

特点:可以根据需要进行扩充

注意:ArrayList存在不安全类型与装箱拆箱的缺点

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
eg:例子1
ArrayList numbers = new ArrayList();

//新增数据
numbers.Add(100);
numbers.Add("AAA");
numbers.Add(true);

//删除数据
numbers.Remove(true);

//修改数据
numbers[1] = "修改数据";

//插入数据
numbers.Insert(2, "插入数据");

eg:例子2
ArrayList numbers = new ArrayList() { 200,5,50,100,800};
ArrayList letters = new ArrayList() { "b", "a", "z", "c", "d" ,"b" };

//排序
numbers.Sort(); //返回 5 50 100 200 800
letters.Sort(); //返回 a b b c d z

//反转
numbers.Reverse(); //返回 800 200 100 50 5
letters.Reverse(); //返回 z d c b b a

Clone()复制一个数组 。。。

具体方法:msdn传送

列表List

List是一个泛型列表。
可通过索引访问的对象的强类型列表, 提供用于对列表进行搜索、排序和操作的方法。

  1. list与ArrayList功能类似
  2. T如果为引用类型则要考虑装箱问题,就和ArrayList效果一样了
1
2
3
4
5
6
List<T> dinosaurs = new List<T>()

eg:1
List<string> numbers = new List<string>();
numbers.Add("ZZZ"); //添加元素
numbers.RemoveAt(0);//移除下标为0的元素

具体方法:msdn传送

字典Dictionary

Dictionary表示键和值的集合,每个元素都是一个键值对。
是一个泛型列表。

  1. 键(key)是唯一的
  2. 键(key)和值(Value)可以是任何类型(包括自定义类型)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Dictionary<TKey,TValue> myDictionary = new Dictionary<TKey,TValue>();

eg:1
Dictionary<string, string> numbers = new Dictionary<string, string>() {
{"id","100"},
{"name","aaa"},
{"lev","15"},
{"info","text text"}
};

//添加数据
numbers.Add("sum","1000");

//移除数据
numbers.Remove("info");

具体方法:msdn传送

排序列表SortedList

SortedList 类代表了一系列按照键来排序的键/值对,这些键值对可以通过键和索引来访问。

  1. 如果您使用索引访问各项,则它是一个动态数组(ArrayList)
  2. 如果您使用键访问各项,则它是一个哈希表(Hashtable)。
  3. 集合中的各项总是按键值排序。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
eg:1
SortedList numbers = new SortedList() {
{100,"aaa"},
{500,"aaa"},
{300,"aaa"},
{1,"aaa"},
{5,"bbb"}
};

foreach (int index in numbers.Keys)
{
Console.Write(index + " " + numbers[index]+", ");
}

1 aaa, 5 bbb, 100 aaa, 300 aaa, 500 aaa,

具体方法:msdn传送

哈希表(Hashtable)

Hashtable 类代表了一系列基于键的哈希代码组织起来的键/值对。它使用键来访问集合中的元素。

  1. HashTable可添加任意类型的元素
  2. HashTable添加时装箱,读取时拆箱
  3. HashTable不支持泛型
  4. Hashtable 的元素属于 Object 类型
1
2
3
4
5
6
7
Hashtable ht = new Hashtable() {
{"100","aaa"},
{"101","xxx"},
{"5","dd"},
{"50","cc"},
{"800","dd"}
};

具体方法:msdn传送

栈Stack

堆栈(Stack)代表了一个后进先出的对象集合。
当您需要对各项进行后进先出的访问时,则使用堆栈。
当您在列表中添加一项,称为推入元素,当您从列表中移除一项时,称为弹出元素。

1
2
3
4
5
6
7
8
9
10
11
Stack st = new Stack();

st.Push("axdsax");
st.Push("sad");
st.Push("adasxx");
st.Push("a4");

foreach (string c in st)
{
Console.Write(c + " ");
}

具体方法:msdn传送

队列(Queue)

队列(Queue)代表了一个先进先出的对象集合。
当您需要对各项进行先进先出的访问时,则使用队列。
当您在列表中添加一项,称为入队,当您从列表中移除一项时,称为出队。

1
2
3
4
5
6
7
8
9
10
11
12
13
Queue que = new Queue();

//向队列加入元素
que.Enqueue("100");
que.Enqueue("105");
que.Enqueue("100");
que.Enqueue("500");

foreach (string c in que)
{
Console.Write(c + " ");
}
100 105 100 500

具体方法:msdn传送

点阵列(BitArray)

BitArray 类管理一个紧凑型的位值数组,它使用布尔值来表示,其中 true 表示位是开启的(1),false 表示位是关闭的(0)。

当您需要存储位,但是事先不知道位数时,则使用点阵列。您可以使用整型索引从点阵列集合中访问各项,索引从零开始。

1
2
3
4
5
6
7
8
9
10
11
12
13
// 创建两个大小为 8 的点阵列
BitArray ba1 = new BitArray(8);
byte[] a = { 60 };


// 把值 60 存储到点阵列中
ba1 = new BitArray(a);

for (int i = 0; i < ba1.Count; i++)
{
Console.Write("{0} ", ba1[i]);
}
返回:False False True True True True False False

具体方法:msdn传送