前言

  本节主要是来了解学习集合,以方便在程序编写时,什么地方该选用什么集合,让程序更健壮的运行起来。在学习了解集合之前,首先需要了解一些数据结构方面的知识。下面我们就先简单的来看一下数据结构。

数据结构

  数据结构就是相互之间存在一种或多种特定关系的数据元素的集合。 程序界有一点很经典的话,程序设计=数据结构+算法。用源代码来体现,数据结构,就是编程。

  

集合分类

在上图中可以看到,集合总体上分为线性集合和非线性集合。线性集合按照存储方式又分为直接存储和顺序存储。

  直接存储,是指该类型的集合数据元素可以直接通过下标(即index)来访问,在C#中直接存储的数据结构有三类:Array(包含数组和List<T>)、string、struct。

  直接存储结构的优点是:向数据结构中添加元素是很高效的,直接放在数据末尾的第一个空位上就可以了。

  直接存储结构的缺点是:向集合插入元素将会变得低效,它需要给插入的元素腾出位置并顺序移动后面的元素。

  顺序存储结构,即线性表。线性表可动态的扩大和缩小,它在一片连续的区域中存储数据元素。线性表不能按照索引进行查找,它是通过对地址的引用来搜索元素的,为了找到某个元素,它必须遍历所有元素,直到找到对应的元素为止。所以,线性表的优点是插入和删除数据效率高,缺点是查找的效率相对来说低一点。

  线性表有可以分为队列、栈以及索引群集,在C#中分别表现为:Queue<T>、Stack<T>,索引群集又进一步泛化为字典类型Dictionary<TKey,TValue>和双向链表LinkedList<T>。

非线性集合自己在实际应用中比较少,而且感觉也比较复杂,所以在此先不做讨论学习。下面我们就来一一的学习一下日常使用比较频繁的集合吧。

数组

数组就是包含同一类型的多个元素。

数组的声明:int[] intArray;

注意:数组声明时,方括号([])必须跟在类型的后面,而不是变量名的后面。在C#中,将方括号放在变量名后是不合法的语法。

数组的初始化:

  我们知道数组是引用类型,所以需要给他们分配堆上的内存。

1、intArray=new int[3];

2、intArray=new int[]{1,2,3};

3、int[] intArray={1,2,3};

数组在声明和初始化后,可以使用索引器进行访问,索引器总是以0开头,表示第一个元素。

多维数组:

  一般可以是一维数组,二维数组、三维数组、多维数组。下面简单的来看一下数组吧

            ///最简单的一维数组
int[] intArray = { , , };
///二维数组,两行三列(类似X轴和Y轴平面几何)
int[,] intTwoArray=new int[,];
intTwoArray[, ] = ;
intTwoArray[, ] = ;
intTwoArray[, ] = ;
intTwoArray[, ] = ;
intTwoArray[, ] = ;
intTwoArray[, ] = ;
///二维数组,三行四列
int[,] intTwoArray2 = new int[,]
{
{ , , },
{ , , },
{ , , },
{ , , }
};
///三维数组,三行三列
int[, ,] intThreeArray;
intThreeArray = new int[,,]
{
{ {,}, {,}, {,} },
{ {,}, {,}, {,} },
{ {,}, {,}, {,} },
{ {,}, {,}, {,} }
};

上面简单的介绍说明了一下一维数组、二维数组和三维数组。

ArrayList

ArrayList类继承了以下几个接口

    public class ArrayList : IList, ICollection, IEnumerable, ICloneable

以下来看一下ArrayList的基本操作

            ///定义一个一维数组
int[] intArray = { , , };
///直接将一维数组转换为ArrayList;
ArrayList array = new ArrayList(intArray);
///Add方法
array.Add();
///Insert方法两个参数,索引位置和值
array.Insert(, );
////删除元素
///直接删除Array中的指定元素
array.Remove();
////删除索引位置为3的元素
array.RemoveAt();
////删除一个范围,从Array中索引为1的元素开始删除三个元素
array.RemoveRange(, );
///Array的遍历
foreach (int i in intArray)
{
Console.WriteLine(i);
}
///查找元素
///查找元素为5,返回值为索引
array.IndexOf();
////查找元素为5的,返回值为true/false
array.Contains(); Console.ReadLine();

List<T>

List<T>类是  ArrayList 类的泛型等效类。 该类使用大小可按需动态增加的数组实现  IList<T> 泛型接口。

看看List<T>所继承的接口

   // 摘要:
// 表示可通过索引访问的对象的强类型列表。提供用于对列表进行搜索、排序和操作的方法。
//
// 类型参数:
// T:
// 列表中元素的类型。
[Serializable]
[DebuggerTypeProxy(typeof(Mscorlib_CollectionDebugView<>))]
[DebuggerDisplay("Count = {Count}")]
public class List<T> : IList<T>, ICollection<T>, IEnumerable<T>, IList, ICollection, IEnumerable

T就是列表中元素的类型,下面我们以string为例进行说明一下List<T>的基本用法。在测试过程中发现List<T>与ArrayList的操作基本完全类似。主要也是它们共同继承了IList,ICollection,IEnumerable三个接口。

T当然也可以是自定义的类型,这也是我们在日常的编程中应用最为广泛的。首先来定义一个实体

    public class Person
{
public string FirstName { get; set; }
public string LastName { get; set; }
}

接下来进行定义和初始化操作

            List<Person> list = new List<Person>();
list.Add(new Person() { FirstName="aehyok",LastName="Kris"});
list.Add(new Person() { FirstName = "aehyok", LastName = "Leo" });

因为操作和上面的ArrayList基本是完全一样的,所以在此就不做过多的介绍了。

Dictionary

1、Dictionary的普通用法

Dictionary<string, string>是一个泛型。它本身有集合的功能有时候可以把它看成数组。它的结构是这样的:Dictionary<[key], [value]>,它的特点是存入对象是需要与[key]值一一对应的存入该泛型,通过某一个一定的[key]去找到对应的值。

        static void Main(string[] args)
{
///声明一个Dictionary对象
Dictionary<string, string> dictionaryList = new Dictionary<string, string>();
///向集合中添加元素
dictionaryList.Add("", "aehyok");
dictionaryList.Add("", "Kris");
dictionaryList.Add("", "Leo");
////通常添加元素的时候都会先判断此键是否已经存在的
if (dictionaryList.ContainsKey(""))
{
dictionaryList.Add("","Niki");
}
////访问元素
string str=dictionaryList[""];
///遍历key
foreach (var key in dictionaryList.Keys)
{
Console.WriteLine("OutPut Key:{0}", key.ToString());
}
////遍历value
foreach (string value in dictionaryList.Values)
{
Console.WriteLine("OutPut Value:{0}", value);
} ///循环遍历key和value
foreach (var dic in dictionaryList)
{
Console.WriteLine("OutPut Key:{0},Value:{1}",dic.Key,dic.Value);
} //移除键值是4的元素
dictionaryList.Remove(""); }

2、将dictionary<key,value> 的value当成一个数组

            Dictionary<string,string[]> stringList=new Dictionary<string,string[]>();
stringList.Add("",new string[]{"北京","深圳","上海","广州"});
stringList.Add("",new string[]{"重庆","武汉","南京"});
Console.WriteLine("OutPut:" + stringList[""][]);

3、将Dictionary<key,value> 的value当成一个实体类

    public class Person
{
public string FirstName { get; set; }
public string LastName { get; set; }
}
     static void Main(string[] args)
{
Dictionary<string,Person> personList=new Dictionary<string,Person>();
Person person = null;
for (int i = ; i < ; i++)
{
person = new Person();
person.FirstName = "aehyok";
person.LastName = "Kris";
personList.Add(i.ToString(),person);
}
foreach (var student in personList)
{
Console.WriteLine("Output : Key {0}, FirstName : {1}, LastName {2}", student.Key, student.Value.FirstName, student.Value.LastName);
}
}

4、文章篇幅有限,关于dictionary有关扩展方法暂时不在此进行介绍,如有兴趣可以参见大神作品http://www.cnblogs.com/ldp615/archive/2011/01/28/dictionary-extensions.html

总结

  其实可以发现它们大体的基本操作是类似的,也就是他们拥有继承共同的接口。这里也只是简单的介绍了我觉得最常见的几个集合的使用。

英语小贴士

Don't be silly。——别胡闹了

I am not available。——我正忙着

There is nothing I can do。——我什么都不能做

Are you still at outside?——你一直呆在外面吗

Everything will be okey in the end。if it's not okey,it’s not the end。——任何事情到了最后都是好的,如果不好,说明还没到最后

作者:aehyok

出处:http://www.cnblogs.com/aehyok/

感谢您的阅读,如果您对我的博客所讲述的内容有兴趣,那不妨点个推荐吧,谢谢支持:-O。

C#基础知识系列十(集合)的更多相关文章

  1. C# 基础知识系列- 3 集合数组

    简单的介绍一下集合,通俗来讲就是用来保管多个数据的方案.比如说我们是一个公司的仓库管理,公司有一堆货物需要管理,有同类的,有不同类的,总而言之就是很多.很乱.我们对照集合的概念对仓库进行管理的话,那么 ...

  2. 学习javascript基础知识系列第三节 - ()()用法

    总目录:通过一段代码学习javascript基础知识系列 注意: 为了便于执行和演示,建议使用chrome浏览器,按F12,然后按Esc(或手动选择)打开console,在console进行执行和演示 ...

  3. java基础解析系列(十)---ArrayList和LinkedList源码及使用分析

    java基础解析系列(十)---ArrayList和LinkedList源码及使用分析 目录 java基础解析系列(一)---String.StringBuffer.StringBuilder jav ...

  4. C# 基础知识系列- 14 IO篇 流的使用

    0. 前言 继续之前的C# IO流,在前几篇小短片中我们大概看了下C# 的基础IO也对文件.目录和路径的操作有了一定的了解.这一篇开始,给大家演示一下流的各种操作.以文件流为例,一起来看看如何操作吧. ...

  5. C# 基础知识系列- 17 小工具优化

    0. 前言 不知道有没有动手能力强的小伙伴照着上一篇的内容写过程序呢?如果有的话,应该会在使用的时候发现以下几个问题: 每次启动都需要经过漫长的时间去遍历磁盘里的文件目录 因为数据是用的字典保存的,所 ...

  6. 基础知识系列☞C#中→属性和字段的区别

    "好吧...准备写个'基础知识系列',算是记录下吧,时时看看,更加加深记忆···" 其实本来准备叫"面试系列"... 字段.属性.你先知道的哪个概念? ***我 ...

  7. 基础知识系列☞Abstract和Virtual→及相关知识

    转载地址→http://www.cnblogs.com/blsong/archive/2010/08/12/1798064.html 在C#的学习中,容易混淆virtual方法和abstract方法的 ...

  8. 学习javascript基础知识系列第二节 - this用法

    通过一段代码学习javascript基础知识系列 第二节 - this用法 this是面向对象语言中的一个重要概念,在JAVA,C#等大型语言中,this固定指向运行时的当前对象.但是在javascr ...

  9. Java基础知识强化之集合框架笔记76:ConcurrentHashMap之 ConcurrentHashMap简介

    1. ConcurrentHashMap简介: ConcurrentHashMap是一个线程安全的Hash Table,它的主要功能是提供了一组和Hashtable功能相同但是线程安全的方法.Conc ...

随机推荐

  1. GaugeControl 数字时钟,温度计,仪表盘

    https://documentation.devexpress.com/#WindowsForms/CustomDocument18217 This topic will guide you thr ...

  2. [转] 控制Arduino的利器-Windows Remote Arduino

    原文地址:控制Arduino的利器-Windows Remote Arduino 1. 概述 相信很多朋友已经在玩 Arduino了,而且一般都是使用官方的Arduino IDE来写程序控制Ardui ...

  3. Java开发中经典的小实例-(100能被3整除的数打印出来)

    public class Test21 {    public static void main(String[] args) {        // TODO Auto-generated meth ...

  4. 智能设备逆向工程之外部Flash读取与分析篇

    智能设备逆向工程之外部Flash读取与分析篇 唐朝实验室 · 2015/10/19 11:19 author: rayxcp 0x00 前言 目前智能家居设备的种类很多,本文内容以某智能豆浆机为例完成 ...

  5. 转:C++ Boost/tr1 Regex(正则表达式)快速指南

    C++ Boost/tr1 Regex(正则表达式)快速指南 正则表达式自Boost 1.18推出,目前已经成为C++11(tr1)的标准部分. 本文以Boost 1.39正则表达式为基础,应该广泛适 ...

  6. 【ubuntu】屏幕超时关闭后不能唤醒

    根据 http://blog.csdn.net/longshenlmj/article/details/18081167修改了"启动laptop_mode模式"gedit 的文件 ...

  7. alu features menu

    可以把所有的custom menu和menu link移植到新的环境下,并且增加新的menu link不会吧module变成overridden, 只需到时recreate生成一个新的module包, ...

  8. 在centos7上作用mongodb

    安装服务端 yum install mongodb-server 安装客户端 yum install mongodb 版本 mongo --version 是否安装了mongodbwhich mong ...

  9. c# string.format json字符串 formatException错误

    正常字符串的string.format是没问题的但是在拼接json的字符串的时候因为里面包含了 {}  花括号 里面又嵌套了 {0} {1} {2}这些要替换的关键字 所以会报错. 经过百度. 字符串 ...

  10. 并发编程 05—— Callable和Future

    Java并发编程实践 目录 并发编程 01—— ThreadLocal 并发编程 02—— ConcurrentHashMap 并发编程 03—— 阻塞队列和生产者-消费者模式 并发编程 04—— 闭 ...