C#基础知识系列十(集合)

简介: 前言   本节主要是来了解学习集合,以方便在程序编写时,什么地方该选用什么集合,让程序更健壮的运行起来。在学习了解集合之前,首先需要了解一些数据结构方面的知识。下面我们就先简单的来看一下数据结构。 数据结构    数据结构就是相互之间存在一种或多种特定关系的数据元素的集合。

前言

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

数据结构

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

  

 

集合分类

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

  直接存储,是指该类型的集合数据元素可以直接通过下标(即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 = { 1, 2, 3 };
            ///二维数组,两行三列(类似X轴和Y轴平面几何)
            int[,] intTwoArray=new int[2,3];
            intTwoArray[0, 0] = 0;
            intTwoArray[0, 1] = 1;
            intTwoArray[0, 2] = 2;
            intTwoArray[1, 0] = 3;
            intTwoArray[1, 1] = 4;
            intTwoArray[1, 2] = 5; 
            ///二维数组,三行四列
            int[,] intTwoArray2 = new int[,] 
            {
                { 1, 11, 111 }, 
                { 2, 22, 222 }, 
                { 3, 33, 333 }, 
                { 4, 44, 444 } 
            };
            ///三维数组,三行三列
            int[, ,] intThreeArray;
            intThreeArray = new int[,,] 
            { 
                { {1,1}, {11,11}, {111,111} }, 
                { {2,2}, {22,22}, {222,222} }, 
                { {3,3}, {33,33}, {333,333} }, 
                { {4,4}, {44,44}, {444,444} } 
             };

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

ArrayList

 ArrayList类继承了以下几个接口

    public class ArrayList : IList, ICollection, IEnumerable, ICloneable

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

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

            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("1", "aehyok");
            dictionaryList.Add("2", "Kris");
            dictionaryList.Add("3", "Leo");
            ////通常添加元素的时候都会先判断此键是否已经存在的
            if (dictionaryList.ContainsKey("4"))
            {
                dictionaryList.Add("4","Niki");
            }
            ////访问元素
            string str=dictionaryList["4"];
            ///遍历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("4");

        }

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

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

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 = 0; i < 3; 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

总结

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

 

 

目录
相关文章
|
3月前
|
SQL 开发框架 .NET
C#进阶-LINQ实现对集合的增删改查
本篇演示了LINQ在日常开发中的常用操作,实现结果集的增删改查。目前LINQ支持两种语法,我会在每个案例前先用大家熟知的SQL语句表达,再在后面用C#的两种LINQ语法分别实现。LINQ语法第一次接触难免感到陌生,最好的学习方式就是在项目中多去使用,相信会有很多感悟。
34 0
|
4月前
|
存储 人工智能 C#
【Unity 3D】C#中数组、集合、栈、队列、哈希表、字典的讲解(附测试代码)
【Unity 3D】C#中数组、集合、栈、队列、哈希表、字典的讲解(附测试代码)
36 0
|
24天前
|
存储 SQL C#
C# 读取二维数组集合输出到Word预设表格
C# 读取二维数组集合输出到Word预设表格
|
1月前
|
存储 安全 Java
34.C#:listT泛型集合
34.C#:listT泛型集合
16 1
|
1月前
|
存储 C#
33.c#:hashtable集合
33.c#:hashtable集合
15 1
|
1月前
|
存储 安全 Java
32.C#:ArrayList集合
32.C#:ArrayList集合
16 1
|
5月前
|
存储 安全 搜索推荐
c#集合_键值对Dictionary & SortedList
在 C# 中,键值对是一种常见的数据结构,可以使用不同的集合类实现。以下是常用的键值对集合类::一种使用哈希表实现的键值对集合。它通过将键哈希为桶号,然后将值存储在桶中进行快速查找。:一种基于数组实现的键值对集合。它会将键值对按照键排序并存储在数组中,以支持快速访问、查找和枚举。:一种使用红黑树实现的键值对集合。它能够按照键的排序进行快速查找,也可以快速地插入和删除键值对,并且该树具备自平衡的特性,使得插入、删除和搜索性能都非常优秀。
63 1
|
1月前
|
开发框架 安全 .NET
C# .NET面试系列三:集合、异常、泛型、LINQ、委托、EF!
<h2>集合、异常、泛型、LINQ、委托、EF! #### 1. IList 接口与 List 的区别是什么? IList 接口和 List 类是C#中集合的两个相关但不同的概念。下面是它们的主要区别: <b>IList 接口</b> IList 接口是C#中定义的一个泛型接口,位于 System.Collections 命名空间。它派生自 ICollection 接口,定义了一个可以通过索引访问的有序集合。 ```c# IList 接口包含一系列索引化的属性和方法,允许按索引访问、插入、移除元素等。 由于是接口,它只定义了成员的契约,而不提供具体的实现。类似于 IEnumera
148 2
|
3月前
|
存储 C# C++
C# 笔记2 - 数组、集合与与文本文件处理
C# 笔记2 - 数组、集合与与文本文件处理
44 0
|
4月前
|
存储
C#-集合小例子
C#-集合小例子
27 0