数组与集合
数组是相同类型的对象的集合。它是一个抽象类。构建数组方法:
Array myArray=Array.CreateInstance(typeof(string),10)
System.Collections
命名空间包含接口和类,这些接口和类定义各种对象(如列表、队列、位数组、哈希表和字典)的集合。
System.Collections.Generic 命名空间包含定义泛型集合的接口和类,泛型集合允许用户创建强类型集合,它能提供比非泛型强类型集合更好的类型安全性和性能。
System.Collections.Specialized 命名空间包含专用的和强类型的集合,例如,链接的列表词典、位向量以及只包含字符串的集合。
集合提供了用于管理对象组的高级功能,集合是一个特殊化的类,用于组织和公开一组对象。与数组一样,可以通过索引访问集合的成员,但不一样的是,集合的大小可以动态调整,而且成员可以在运行时添加和删除。
集合都实现了
ICollection
接口,而
ICollection
接口继承自
IEnumerable
接口,因此每个内建的集合也实现了
IEnumerable
接口。
ICollection
接口主要方法:
GetEnumerator
:遍历整个集合。返回一个
IEnumerator
对象。
CopyTo
:将集合的元素复制到一个数组中。
ICollection
接口主要属性:
Count:
集合中元素的个数。
IsSynchornized:
表明这个类是否是线程安全的。
SyncRoot:
设置对象是否与集合同步。
1 ArrayList
集合
ArrayList
实际上是
Array
的优化版本,功能强于
Array
。
ArrayList 的特点:
ArrayList 的特点:
(
1
)
Array
容量或元素个数固定,而
ArrayList
容量则可动态扩展。
(
2
)
Array
只一次只能对一个索引进行操作,而
ArrayList
则可以添加、插入或移除一组元素。
(
3
)
Array
下界可以设置,而
ArrayList
的下界始终为
0
。
(
4
)
Array
可以有多维,而
ArrayList
只有一维。
(
5
)
System.Array
与
System.IConllections.ArrayList
属于不同的命名空间。
ArrayList arrayList1
=
new
ArrayList();
arrayList1.Add(
100
);
//
添加单个元素

foreach
(
int
number1
in
new
int
[
6
]
...
{ 9, 8, 7, 6, 5, 4 }
)
...
{
arrayList1.Add(number1);//集体添加方法一
}


int
[] number2
=
new
int
[
2
]
...
{88,99}
;
arrayList1.AddRange(number2);
//
集体添加方法二
arrayList1.Remove(
88
);
//
移除值为的
arrayList1.RemoveAt(
3
);
//
移除第三个
//
新的arrayList2只取旧的arrayList1中的前三个元素
ArrayList arrayList2
=
new
ArrayList(arrayList1.GetRange(
1
,
3
));
Console.WriteLine(
"
遍历方法一:
"
);
foreach
(
int
i
in
arrayList1)
...
{
Console.WriteLine(i);
}

Console.WriteLine(
"
遍历方法二:
"
);
for
(
int
i
=
0
; i
<
arrayList2.Count; i
++
)
...
{
int number = (int)arrayList2[i];
Console.WriteLine(number);
}

2
Hashtable
集合
(
1
)哈希表哈简述
哈希表用于处理和表现类似
key/value
的键值对,其中
key
通常可用来快速查找,同时
key
是区分大小写
,
不可以重复;
value
用于存储对应于
key
的值。
Hashtable
中
key/value
键值对均为
object
类型,所以
Hashtable
可以支持任何类型的
key/value
键值对
.
( 2 )哈希表的成员
( 2 )哈希表的成员
A
主要方法
Add(key,value)
:在哈希表中添加一个
key/value
键值对
Remove(key)
:在哈希表中去除某个
key/value
键值对
Clear()
:从哈希表中移除所有元素
Contains(key)
:判断哈希表是否包含特定键
key
GetEnumerator
:遍历
哈希表
。返回一个
IEnumerator
对象。
B
主要属性
:
Count
:设置或获取键值对的数量
Keys
:返回
ICollection
,它包含哈希表中键。
Values
:返回
ICollection
,它包含哈希表中值。
哈希表
简单操作
Hashtable ht
=
new
Hashtable();
//
添加key/value键值对
ht.Add(
"
C
"
,
"
c
"
);
ht.Add(
"
E
"
,
"
e
"
);
ht.Add(
"
A
"
,
"
a
"
);
ht.Add(
"
D
"
,
"
d
"
);
ht.Add(
"
B
"
,
"
b
"
);


//
得到键的值
String s
=
ht[
"
E
"
].ToString();
//
判断哈希表是否包含特定的键
if
(ht.Contains(
"
D
"
))
...
{
Console.WriteLine("include D key ");
}

//
移除键D
ht.Remove(
"
D
"
);
Console.WriteLine(ht[
"
D
"
]);
//
无输出
ht.Clear();
Console.WriteLine(ht[
"
B
"
]);
//
无输出
遍历哈希表
foreach (DictionaryEntry de in
ht)
...
{
Console.WriteLine(de.Key + ":" + de.Value);
}


3 SortedList集合
它是个混合性的集合。混合了ArrayList和Hashtable。表示键/值对的集合,与哈希表类似,区别在于SortedList中的Key数组是排好序的。
SortedList sortedList
=
new
SortedList();
//
添加key/value键值对
sortedList.Add(
"
c
"
,
41
);
sortedList.Add(
"
a
"
,
42
);
sortedList.Add(
"
d
"
,
11
);
sortedList.Add(
"
b
"
,
13
);
foreach
(DictionaryEntry de
in
sortedList)
...
{
string s = de.Key.ToString();
int i = (int)de.Value;
Console.WriteLine("{0},{1}", s, i);
}

4 Stack集合
栈,表示对象的后进先出集合。
主要方法:
Peek():返回集合顶部元素,但不删除此元素
Pop():出栈,返回并删除集合顶部元素
Push():入栈,将指定元素插入到集体顶部
Stack sk1
=
new
Stack();
Stack sk2
=
new
Stack();
//
入栈

foreach
(
int
i
in
new
int
[
4
]
...
{ 1, 2, 3, 4 }
)
...
{
sk1.Push(i);
sk2.Push(i);
}

//
遍历后进先出所以输出为,3,2,1
foreach
(
int
i
in
sk1)
...
{
Console.WriteLine(i);
}

//
出栈,顶部元素被删除
sk1.Pop();
Console.WriteLine(
"
出栈Pop
"
);
foreach
(
int
i
in
sk1)
...
{
Console.WriteLine(i);
}

//
返回顶部元素,但不删除
sk2.Peek();
Console.WriteLine(
"
Peek
"
);
foreach
(
int
i
in
sk2)
...
{
Console.WriteLine(i);
}
5 Queue集合
队列,表示对象的先进先出集合。
主要方法:
Enqueue():入队列,将指定元素添加到集合的结尾。
Dequeue():出队列,返回并删除集合开始处的元素。
Peek():返回集合顶部元素,但不删除此元素
Queue qu1
=
new
Queue();
Queue qu2
=
new
Queue();
//
入队

foreach
(
int
i
in
new
int
[
4
]
...
{ 1, 2, 3, 4 }
)
...
{
qu1.Enqueue(i);
qu2.Enqueue(i);
}

//
遍历先进先出所以输出为,2,3,4
foreach
(
int
i
in
qu1)
...
{
Console.WriteLine(i);
}

//
出队,顶部元素被删除
qu1.Dequeue();
Console.WriteLine(
"
出队Dequeue
"
);
foreach
(
int
i
in
qu1)
...
{
Console.WriteLine(i);
}

//
返回顶部元素,但不删除
qu2.Peek();
Console.WriteLine(
"
Peek
"
);
foreach
(
int
i
in
qu2)
...
{
Console.WriteLine(i);
}
6 Dictionary泛型集合
泛型最常见的用途是泛型集合,命名空间System.Collections.Generic 中包含了一些基于泛型的集合类,使用泛型集合类可以提供更高的类型安全性,还有更高的性能,避免了非泛型集合的重复的装箱和拆箱。
很多非泛型集合类都有对应的泛型集合类,下面是常用的非泛型集合类以及对应的泛型集合类:
很多非泛型集合类都有对应的泛型集合类,下面是常用的非泛型集合类以及对应的泛型集合类:
|
非泛型集合类
|
泛型集合类
|
|
ArrayList
|
List<T>
|
|
HashTable
|
DIctionary<T>
|
|
Queue
|
Queue<T>
|
|
Stack
|
Stack<T>
|
|
SortedList
|
SortedList<T>
|
我们用的比较多的非泛型集合类主要有 ArrayList类和 HashTable类。我们经常用HashTable 来存储将要写入到数据库或者返回的信息,在这之间要不断的进行类型的转化,增加了系统装箱和拆箱的负担,如果我们操纵的数据类型相对确定的化 用 Dictionary<TKey,TValue> 集合类来存储数据就方便多了,例如我们需要在电子商务网站中存储用户的购物车信息( 商品名,对应的商品个数)时,完全可以用 Dictionary<string, int> 来存储购物车信息,而不需要任何的类型转化。
常用的属性和方法如下:
|
常用属性
|
属性说明
|
|
获取用于确定字典中的键是否相等的 IEqualityComparer。
| |
|
获取包含在 Dictionary 中的键/值对的数目。
| |
|
获取或设置与指定的键相关联的值。
| |
|
获取包含 Dictionary 中的键的集合。
| |
|
获取包含 Dictionary 中的值的集合。
| |
|
常用的方法
|
方法说明
|
|
将指定的键和值添加到字典中。
| |
|
从 Dictionary 中移除所有的键和值。
| |
|
确定 Dictionary 是否包含指定的键。
| |
|
确定 Dictionary 是否包含特定值。
| |
|
已重载。 确定两个 Object实例是否相等。 (从 Object继承。)
| |
|
返回循环访问 Dictionary 的枚举数。
| |
|
用作特定类型的哈希函数。GetHashCode适合在哈希算法和数据结构(如哈希表)中使用。 (从 Object继承。)
| |
|
获取当前实例的 Type。 (从 Object继承。)
| |
|
实现 System.Runtime.Serialization.ISerializable 接口,并在完成反序列化之后引发反序列化事件。
| |
|
确定指定的 Object 实例是否是相同的实例。 (从 Object继承。)
| |
|
从 Dictionary 中移除所指定的键的值。
| |
|
返回表示当前 Object 的 String。 (从 Object继承。)
| |
|
获取与指定的键相关联的值。
|
下面是简单的例子,包括声明,填充键值对,移除键值对,遍历键值对。
Dictionary
<
string
,
string
>
myDic
=
new
Dictionary
<
string
,
string
>
();
myDic.Add(
"
aaa
"
,
"
111
"
);
myDic.Add(
"
bbb
"
,
"
222
"
);
myDic.Add(
"
ccc
"
,
"
333
"
);
myDic.Add(
"
ddd
"
,
"
444
"
);
//
如果添加已经存在的键,add方法会抛出异常
try

...
{
myDic.Add("ddd", "444");
}
catch
(ArgumentException ex)
...
{
Console.WriteLine("此键已存在"+ex.Message);
}

//
解决add()异常的方法是用ContainsKey()方法来判断键是否存在
if
(
!
myDic.ContainsKey(
"
ddd
"
))
...
{
myDic.Add("ddd", "ddd");
}
else

...
{
Console.WriteLine("此键已存在");
}

//
而使用索引器来负值时,如果建已经存在,就会修改已有的键的键值,而不会抛出异常
myDic[
"
ddd
"
]
=
"
ddd
"
;
myDic[
"
eee
"
]
=
"
555
"
;
//
使用索引器来取值时,如果键不存在就会引发异常
try

...
{
Console.WriteLine("不存在的键fff的键值为: " + myDic["fff"]);
}
catch
(KeyNotFoundException ex)
...
{
Console.WriteLine("没有找到键引发异常:"+ex.Message);
}

//
解决上面的异常的方法是使用ContarnsKey() 来判断时候存在键,如果经常要取健值得化最好用TryGetValue方法来获取集合中的对应键值
string
value
=
""
;
if
(myDic.TryGetValue(
"
fff
"
,
out
value))
...
{
Console.WriteLine("不存在的键fff的键值为: " + value);
}
else

...
{
Console.WriteLine("没有找到对应键的键值");
}

//
下面用foreach 来遍历键值对
//
泛型结构体用来存储健值对
foreach
(KeyValuePair
<
string
,
string
>
kvp
in
myDic)
...
{
Console.WriteLine("key={0},value={1}",kvp.Key,kvp.Key);
}

//
获取值得集合
foreach
(
string
s
in
myDic.Values)
...
{
Console.WriteLine("value={0}",s);
}

//
获取值得另一种方式
Dictionary
<
string
,
string
>
.ValueCollection values
=
myDic.Values;
foreach
(
string
s
in
values)
...
{
Console.WriteLine("value={0}",s);
}

本文介绍了不同类型的集合,包括ArrayList、Hashtable、SortedList、Stack、Queue及泛型Dictionary等,阐述了它们的特点、应用场景及常用方法。

2473

被折叠的 条评论
为什么被折叠?



