数组与集合

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 
 
 
数组与集合
 
    数组是相同类型的对象的集合。它是一个抽象类。构建数组方法:
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
的特点:
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 987654 } )
            
{
                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 )哈希表的成员
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集合
它是个混合性的集合。混合了ArrayListHashtable。表示键/值对的集合,与哈希表类似,区别在于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 1234 } )
            
{
                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 1234 } )
            
{
                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 中的值的集合。
常用的方法
方法说明
Add
将指定的键和值添加到字典中。
从 Dictionary 中移除所有的键和值。
确定 Dictionary 是否包含指定的键。
确定 Dictionary 是否包含特定值。
Equals 
返回循环访问 Dictionary 的枚举数。
获取当前实例的 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);
            }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值