首页 技术 正文
技术 2022年11月19日
0 收藏 554 点赞 4,051 浏览 8049 个字

C#中4个常用的集合

1.ArrayList

ArrayList类似于数组,有人也称它为数组列表。ArrayList可以动态维护,而数组的容量是固定的。

它的索引会根据程序的扩展而重新进行分配和调整。和数组类似,它所存储的数据称为元素,它所保存的元素数就是它的容量。默认初始容量为0,在使用它时,需引入命名空间System.Connections;以下代码可以定义一个ArrayList:

using System.Collections;

//创建容量为0的ArrayList对象

ArrayList myList = new ArrayList();

//创建容量为5的ArrayList对象

ArrayList myList = new ArrayList(5);

//获取对象中实际包含的元素数

int num = myList.Count();

ArrayList通过Add()方法添加元素,其方法返回一个Int类型的值,这个值代表所添加的元素在集合中的索引。

参数:如果向ArrayList中添加的元素是值类型,那么这些元素就会自动装箱处理转换为Object引用类型,然后保存,所以ArrayList中的所有元素都是对象的引用。

删除ArrayList中的元素有三种方法,分别为:

对象名.RomoveAt(int index);

对象名.Romove(Object value);

对象名.Clear();(这种方法会将集合中的所有元素删除,俗称”清空”~~~)

2.HashTable

C# /提供了一种称为HashTable的数据结构,通常称为哈希表,有的人称它为”字典”.HashTable的数据是通过键(Key)和值(Value)来组织的,同ArrayList一样,它也属于System.Collections命名空间中,它所存放的每个元素都是键/值对.以下为HashTable的常用方法和属性:

属性名称:Count

属性名称:Keys

属性名称:Values  说明: 获取包含在HashTable中值的集合

方法名称:Add(Object key,Object Value)

方法名称:Remove(Object Key)

方法名称:Clear()

和ArrayList不同,访问HashTable元素时可以直接通过键名来获取具体值,同样,由于值类型是Object.所以当得到一个值时也需要通过类型转换得到指定类型的对象.

3. 泛型集合: List<T>

泛型是C#2.0中的一个新特性。泛型引入了一个新概念:类型参数。通过使用类型参数(T),减少了运行时强制转换成装箱操作的风险。通过泛型集合可以最大限度的重用代码、保护类型的安全及提高性能。

定义一个 List<T>泛型集合的方法如下:

List<T> 对象名 = new List<T>();

List<T>添加元素、获取元素、删除元素以及遍历和ArrayList用法都是类似的,但 List<T>保障了类型的安全性。在获取元素时无需进行类型转换.下面我们把List<T>和ArrayList作以比较

不用点:List<T>对所保存元素做类型约束,而ArrayList可以增加任意类型。添加、读取值类型元素 List<T>无需拆箱装箱,而ArrayList需要做拆箱、装箱处理。

相同点:通过索引访问集合中的元素,添加、删除元素方法相同

4.泛型集合Dictionary<K,V>

它具有泛型的全部特性,编译时检查类型约束,获取元素时无需类型转换,并且它存储数据的方式和HashTable类似。也是通过Key/Value对元素保存的。定义语法为:

Dictionary<K,V>对象名 = new Dictionary<K,V>

<K,V>中的K表示集合中Key的类型,V表示Value的类型,它的含义和List<T>是相同的.例如:

Dictionary<string,SE> engineers = new Dictionary<string,SE>();

在这个集合中,Key类型是string类型,Value是SE类型。 下面我们把 Dictionary<K,V> 和HashTable作以比较:

不同点: Dictionary<K,V>对所保存的元素做类型约束,而HashTable可以增加任何类型。 Dictionary<K,V>添加、读取值类型元素无需拆箱、装箱,而HashTable需要做拆箱、装箱处理

相同点:通过Key获取Value, 添加、删除、遍历元素方法相同

C#中四种集合的运用

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;
using System.Diagnostics;namespace C_中四种集合的运用
{
class Program
{
static void Main(string[] args)
{
ArrayList array = new ArrayList();//实例化一个ArrayList集合对象
Hashtable hashtable = new Hashtable();//实例化一个HashTable集合对象
List<Student> list = new List<Student>();//实例化一个List<>集合对象
Dictionary<string, Student> dictionary = new Dictionary<string, Student>();//实例化一个Directory<>集合对象
Student Zhang = new Student("张三", '男', );
Student Li = new Student("李四", '女', ); //实例化3个Student对象
Student Sun = new Student("小五", '女', );
Stopwatch sw = new Stopwatch();
sw.Start();
Console.WriteLine(" 使用ArrayList 集合 ");
array.Add(Zhang);
array.Add(Li); //用ArrayList的对象名添加Student对象
array.Add(Sun);
Console.WriteLine("**********使用For循环遍历**********");
for (int i = ; i < array.Count; i++)
{
Student stu = (Student)array[i];
Console.WriteLine("我的姓名是{0},年龄是{1},性别是{2}", stu.Name, stu.Age, stu.Sex);
}
Console.WriteLine();
Console.WriteLine("删除Student张三的信息");
array.Remove(Zhang);//用对象名删除元素
Console.WriteLine("\n***********使用Foreach循环遍历一***********"); foreach (Student item in array)
{
Console.WriteLine("我的姓名是{0},年龄是{1},性别是{2}", item.Name, item.Age, item.Sex); } Console.WriteLine("\n***********使用Foreach循环遍历二***********");
foreach (Student item in array)
{
Student stu = (Student)item;
Console.WriteLine("我的姓名是{0},年龄是{1},性别是{2}", stu.Name, stu.Age, stu.Sex);
}
Console.WriteLine("\n***********使用Foreach循环遍历三***********");
foreach (var item in array)
{
Student stu = (Student)item;
Console.WriteLine("我的姓名是{0},年龄是{1},性别是{2}", stu.Name, stu.Age, stu.Sex);
}
Console.WriteLine();
Console.WriteLine(" 使用HashTable集合");
hashtable.Add("张三", Zhang);
hashtable.Add("李四", Li);//
hashtable.Add("小五", Sun);
Console.WriteLine("删除Student李四的信息");
hashtable.Remove("李四");//用键(key)移除元素
Console.WriteLine("\n***********使用Foreach循环遍历集合的所有值一***********");
foreach (Student item in hashtable.Values)//循环遍历集合的值
{ Console.WriteLine("我的姓名是{0},年龄是{1},性别是{2}", item.Name, item.Age, item.Sex);
}
Console.WriteLine("\n***********使用Foreach循环遍历集合的所有值二***********");
foreach (Student item in hashtable.Values)//循环遍历集合的值
{
Student stu = (Student)item;
Console.WriteLine("我的姓名是{0},年龄是{1},性别是{2}", stu.Name, stu.Age, stu.Sex);
}
Console.WriteLine("\n***********使用Foreach循环遍历集合的所有值三***********");
foreach (var item in hashtable.Values)//循环遍历集合的值
{
Student stu = (Student)item;
Console.WriteLine("我的姓名是{0},年龄是{1},性别是{2}", stu.Name, stu.Age, stu.Sex);
}
Console.WriteLine();
Console.WriteLine("***********使用Foreach循环遍历Name值******");
foreach (string Name in hashtable.Keys)//循环遍历集合的键(key)
{
Console.WriteLine("我的姓名是{0}", Name);
}
Console.WriteLine();
Console.WriteLine(" 使用List<>集合");
list.Add(Zhang);
list.Add(Li); //为List<>集合添加元素
list.Add(Sun);
Console.WriteLine("***********使用Foreach循环遍历***********");
list.Remove(Sun);//移除集合元素Sun的信息
foreach (var item in list)
{
Console.WriteLine("我的姓名是{0},年龄是{1},性别是{2}", item.Name, item.Age, item.Sex);
}
Console.WriteLine();
list.RemoveAt();//移除集合中索引为0的元素
Console.WriteLine("***********使用For循环遍历*********");
for (int i = ; i < list.Count; i++)
{
Console.WriteLine("我的姓名是{0},年龄是{1},性别是{2}", list[i].Name, list[i].Age, list[i].Sex);
}
Console.WriteLine();
Console.WriteLine(" 使用Directory<>集合");
dictionary.Add("张三", Zhang);
dictionary.Add("李四", Li); //为Directory<>集合添加元素
dictionary.Add("小五", Sun);
Console.WriteLine("*************使用Foreach循环遍历***********");
foreach (var item in dictionary.Values)
{
Console.WriteLine("我的姓名是{0},年龄是{1},性别是{2}", item.Name, item.Age, item.Sex);
}
Console.WriteLine();
dictionary.Remove("李四");//移除集合中李四的信息
Console.WriteLine("************使用Foreach循环遍历Name值******");
foreach (string Name in dictionary.Keys)
{
Console.WriteLine("我的姓名是{0}", Name);
}
sw.Stop();
Console.WriteLine("时间:{0}", sw.ElapsedMilliseconds);
Console.ReadLine();
} }
}
//--------------------------Student-----------------------------------
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;namespace C_中四种集合的运用
{
public class Student
{
public Student() { }
public Student(string name, char sex, int age)
{
this.Name = name;
this.Sex = sex;
this.Age = age;
}
public string Name { get; set; }
public char Sex { get; set; }
public int Age { get; set; }
}}

C#中四种集合的运用

另:如何选择集合类型??

在.NET Framework中提供了很多集合类,如ArrayList、Hashtable、SortedList、ListDictionary、Queue、NameValueCollection、List<T>、Dictionary<TKey,TValue>及数组等,要了解各个集合的特性,选择合适的集合。

在所有的集合中数组是性能最高的,如果要存储的数据类型一致和容量固定,特别是对值类型的数组进行操作时没有装箱和拆箱操作,效率极高。

在选择集合类型时应考虑几点:

(1)集合中的元素类型是否是一致的,比如集合中将要存储的元素都是int或者都是string类型的就可以考虑使用数组或者泛型集合,这样在存储数值类型元素就可以避免装箱拆箱操作,即使是引用类型的元素也可以避免类型转换操作。

(2)集合中的元素个数是否是固定的,如果集合中存储的元素是固定的并且元素类型是一致的就可以使用数组来存储。

(3)将来对集合的操作集中在那些方面,如果对集合的操作以查找居多可以考虑HashTable或者Dictionary<TKey,TValue>这样的集合,因为在.NETFramework中对这类集合采用了特殊机制,所以在查找时比较的次数比其它集合要少。

另外,在使用可变集合时如果不制定初始容量大小,系统会使用一个默认值来指定可变集合的初始容量大小,如果将来元素个数超过初始容量大小就会先在内部重新构建一个集合,再将原来集合中的元素复制到新集合中,可以在实例化可变集合时指定一个相对较大的初始容量,这样在向可变集合中添加大量元素时就可以避免集合扩充容量带来的性能损失。

System.Collections 命名空间包含接口和类,这些接口和类定义各种对象(如列表、队列、位数组、哈希表和字典)的集合。

System.Collections.Generic 命名空间包含定义泛型集合的接口和类,泛型集合允许用户创建强类型集合,它能提供比非泛型强类型集合更好的类型安全性和性能。

System.Collections.Specialized 命名空间包含专用的和强类型的集合,例如,链接的列表词典、位向量以及只包含字符串的集合。

数组

数组是大部分编程语言中都支持的一种数据类型,无论C语言、C++还是C#以及Java

都支持数组的概念。

数组是具有同一类型的多个对象的集合,是一种数据结构,包含同一类型的多个元素。数组是一组具有相同类型的变量的集合,如一组整数、一组字符等。组成数组的这些变量称为数组的元素。每个数组元素都有一个编号,这个编号叫做下标,C#中的下标是从0开始的,最大的下标等于数组元素个数减一。C#中可以通过下标来区别这些元素。数组元素的个数有时也称之为数组的长度。

数组类型从类型System.Array继承而来。System.Array类表示所有的数组,不论这些数组的元素类型或秩如何。对数组定义的操作有:根据大小和下限信息分配数组;编制数组索引以读取或写入值;计算数组元素的地址;以及查询秩、边界和数组中存储的值的总数。

1、  数组是固定大小的,不能伸缩。虽然System.Array.Resize这个泛型方法可以重置数组大小,但是该方法是重新创建新设置大小的数组,用的是旧数组的元素初始化。随后以前的数组就废弃!而集合却是可变长的。

2、 数组要声明元素的类型,集合类的元素类型却是object。

3、 数组可读可写,不能声明只读数组。集合类可以提供ReadOnly方法以只读方式使用集合。

4、 数组要有整数下标才能访问特定的元素,然而很多时候这样的下标并不是很有用。集合也是数据列表却不使用下标访问。很多时候集合有定制的下标类型,对于队列和栈根本就不支持下标访问!

1. 定义

一个数组的定义中包含以下几个要素:

Ø  元素类型(相同)

Ø  数组的维数(初始化时必须给定)

Ø  每个维数的上下限

首先,给定类型的数组只能保存该类型的元素。其次要规定数组的维数,可以用几何的知识理解数组的维数,可以用一维坐标轴来理解一维数组;用平面直角坐标系来理解二维数组;用三维立体坐标系来理解三维数组等。再次,数组必须规定每个维数的大小。

如:

int[] anIntArray;    //定义数组

anIntArray={1,2,3};//上述代码定义了一个数组并对其进行了初始化。可以一次完成

int [] sz=newint[];   //初始化数组,如果不指定大小,报语法错误。

anIntArray=new  int[]{1,2,3};//用new关键字初始化数组的元素

anIntArray=new  int[3]{1,2,3};//指定数组大小用new关键字初始化数组元素

数组还有另外一种初始化方式,即指定数组大小并用new关键字初始化数组的元素:

int[] anIntArray=new  int[3];

执行时.NET将会为数组中的每一个元素赋予同一个(定义类型的)默认值。对于Int型的变量来说这个默认值是0。

2、数组的索引

数组的索引也就是通常所说的数组下标,英文为Index。数组的索引是从0开始的。

3、数组的遍历

C#提供了foreach语句以实现数组的遍历功能。可以使用foreach语句访问数组中的每个元素而不需要确切地知道每个元素的索引。

int[] myArray=new int[5]  {14, 25, 7,36, 53};

//采用foreach语句对myArray进行遍历

foreach(int number inmyArray)

Console.Write(number);

for (int i= 0; i < 5; i++)

Console.Write(myArray[i]);

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,103
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,579
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,427
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,199
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,834
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,917