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]);

C#中四种常用集合的运用(非常重要)的更多相关文章

  1. C#中四种常用集合的运用(非常重要)【转】

    1.ArrayList ArrayList类似于数组,有人也称它为数组列表.ArrayList可以动态维护,而数组的容量是固定的. 它的索引会根据程序的扩展而重新进行分配和调整.和数组类似,它所存储的 ...

  2. MySQL中四种常用存储引擎的介绍

    MySQL常用的四种引擎的介绍 (1):MyISAM存储引擎: 不支持事务.也不支持外键,优势是访问速度快,对事务完整性没有 要求或者以select,insert为主的应用基本上可以用这个引擎来创建表 ...

  3. .NET中四种常用事物

    在一个MIS系统中,没有用事务那就绝对是有问题的,要么就只有一种情况:你的系统实在是太小了,业务业务逻辑有只要一步执行就可以完成了.因此掌握事务 处理的方法是很重要,进我的归类在.net中大致有以下4 ...

  4. Java中四种引用:强、软、弱、虚引用

    这篇文章非常棒:http://alinazh.blog.51cto.com/5459270/1276173 Java中四种引用:强.软.弱.虚引用 1.1.强引用当我们使用new 这个关键字创建对象时 ...

  5. java正则表达式四种常用的处理方式是怎么样呢《匹配、分割、代替、获取》

    java 正则表达式高级篇,介绍四种常用的处理方式:匹配.分割.替代.获取,具体内容如下package test; import java.util.regex.Matcher; import jav ...

  6. 【转】 FPGA设计的四种常用思想与技巧

    本文讨论的四种常用FPGA/CPLD设计思想与技巧:乒乓操作.串并转换.流水线操作.数据接口同步化,都是FPGA/CPLD逻辑设计的内在规律的体现,合理地采用这些设计思想能在FPGA/CPLD设计工作 ...

  7. 转--Android按钮单击事件的四种常用写法总结

    这篇文章主要介绍了Android按钮单击事件的四种常用写法总结,比较了常见的四种写法的优劣,有不错的参考借鉴价值,需要的朋友可以参考下     很多学习Android程序设计的人都会发现每个人对代码的 ...

  8. Java中几种常用数据类型之间转换的方法

    Java中几种常用的数据类型之间转换方法: 1. short-->int 转换 exp: short shortvar=0; int intvar=0; shortvar= (short) in ...

  9. javaservlet处理四种常用api请求get,put,post,delete

    一般在网站搭建中servlet只需处理post,get请求便足已.本篇注重使用javaweb编写restful风格api,在servlet中对四种常用请求进行处理. 在api中对于一个请求要做的通常是 ...

随机推荐

  1. ngx_lua_API 指令详解(四)ngx.exec指令

    https://github.com/openresty/lua-nginx-module#ngxexec 参照:http://blog.csdn.net/weiyuefei/article/deta ...

  2. [整理]zepto的初次使用

    http://www.css88.com/doc/zeptojs_api/ http://chaoskeh.com/blog/some-experience-of-using-zepto.html

  3. 加速计 & CoreMotion

    CHENYILONG Blog 加速计 & CoreMotion 加速计 & CoreMotion 技术博客http://www.cnblogs.com/ChenYilong/ 新浪微 ...

  4. [python]使用python实现Hadoop MapReduce程序:计算一组数据的均值和方差

    这是参照<机器学习实战>中第15章“大数据与MapReduce”的内容,因为作者写作时hadoop版本和现在的版本相差很大,所以在Hadoop上运行python写的MapReduce程序时 ...

  5. CodeAction_beta02 斐波那契 (多维DP)

    题面: solution: 这题和斐波那契数列没有任何关系!!!!! 这题就是一个无脑DP!!!!!!!!!! 因为所有数都要出现至少一次,所以只需考虑其组合而不用考虑其排列,最后乘个 n!就是了(意 ...

  6. linux笔记_day11_shell编程

    1.条件测试类型: 整数测试 字符测试 文件测试 条件测试的表达式: [ expression ] 必须有空格 [[ expression ]] test expression 整数比较 : -eq  ...

  7. MVC 获取路由的 URL 参数值和默认值的集合。

    跟aspx页面不一样 用Request 获取不到路由配置的 参数 可以采用下面方法获取 public ActionResult List() { //获取路由中所有的key foreach (stri ...

  8. Oracle JDK vs OpenJDK

    OpenJDK是Sun在2006年末把Java开源而形成的项目,这里的“开源”是通常意义上的源码开放形式,即源码是可被复用的,例如IcedTea.UltraViolet都是从OpenJDK源码衍生出的 ...

  9. USING NHIBERNATE WITH MySQL

    In previous USING NHIBERNATE WITH SQLITE, we connect SQLITE with ORM framework NHibernate. One of th ...

  10. 在idea中关闭vim模式

    每次在idea的文件中插入新的内容时,都需要先点击键盘上的i 进入插入模式,感觉这是vim编辑器的模式,很不习惯. 你可能是按照了vim emulation 插件, 在setting-----plug ...