C#集合类详解,Hashtable 和 SortedList 类,Dictionary 和 SortedLi,Array ,ArrayList ,List ,Stack,SortedDictionar


集合类概述

集合类具有以下特点:

  • 集合类定义为 System.CollectionsSystem.Collections.Generic 命名空间的一部分。
  • 大多数集合类都派生自 ICollectionIComparer IEnumerableIListIDictionary IDictionaryEnumerator 接口以及它们的等效泛型接口。
  • 使用泛型集合类可以提供更高的类型安全性,在某些情况下还可以提供更好的性能,尤其是在存储值类型时,这些优势会体现得更明显。有关更多信息,请参见 泛型的优点

定义集合 

集合是一组组合在一起的类似的类型化对象。

任何类型的对象都可被组合到 Object 类型的单个集合中,以利用采用该语言继承的构造。例如,C# foreach 语句(Visual Basic 中的 for each )需要集合中的所有对象都属于单一类型。

但是,在 Object 类型的集合中,单独对各元素执行附加的处理,例如装箱和取消装箱或转换,这影响该集合的性能。装箱和取消装箱通常在存储或检索 Object 类型集合中的值类型时发生 。因此,应该尽量避免把值类型作为集合元素。

泛型集合(如 List )和强类型非泛型集合(如 StringCollection )可避免造成上述性能损害,前提是元素的类型是集合所需的类型(例如,从 StringCollection 存储或检索字符串)。此外,强类型集合自动执行添加到该集合的每一元素的类型验证。

除添加、移除或搜索元素的方法外,直接或间接实现 ICollection 接口或 ICollection 泛型接口的所有集合还共享若干功能:

  • 枚举数。

枚举数是循环访问其关联集合的对象。它可被视作指向集合中任何元素的可移动的指针。一个枚举数只能与一个集合关联,但一个集合可以具有多个枚举数。C# foreach 语句(Visual Basic 中的 for each )使用枚举数并隐藏操作该枚举数的复杂性。

  • 同步成员。

同步在访问集合的元素时提供线程安全。默认情况下集合不是线程安全的。在 System.Collections 命名空间中只有几个类提供 Synchronize 方法,该方法能够超越集合创建线程安全包装。但是, System.Collections 命名空间中的所有类都提供 SyncRoot 属性,可供派生类创建自己的线程安全包装。还提供了 IsSynchronized 属性以确定集合是否是线程安全的。 ICollection 泛型接口中不提供同步功能。

  • The CopyTo 方法。

使用 CopyTo 方法可将所有集合复制到数组中;但是,新数组中元素的顺序基于枚举数返回它们的顺序。结果数组始终是具有零下限的一维数组。

注意, ICollection 泛型接口包含非泛型接口未包含的成员。

以下功能在 System.Collections 命名空间中的一些类中实现:

  • 容量和计数。

集合的容量是其可以包含的元素的数目。集合的计数是其实际包含的元素的数目。 BitArray 是一个特例;其容量与其长度相同,而其长度与其计数相同。某些集合隐藏容量或计数(或两者一起隐藏)。

System.Collections 命名空间中的所有集合在达到当前容量时可自动扩充容量。内存被重新分配,元素从旧集合复制到新集合中。这减少了使用集合所需的代码;但是,集合的性能可能仍受到消极影响。避免因多次重新分配导致不佳性能的最佳方法是将初始容量设置为集合的估计的大小。

  • 下限。

集合的下限是其第一个元素的索引。 System.Collections 命名空间中的所有索引集合的下限均为零。 Array 的下限在默认情况下为零,但使用 CreateInstance 创建 Array 类的实例时可以定义不同的下限。

System.Collections 类通常可以分为三种类型:

  • 常用集合。

这些集合是数据集合的常见变体,如哈希表、队列、堆栈、字典和列表。常用集合有泛型和非泛型之分。

  • 位集合。

这些集合中的元素均为位标志。它们的行为与其他集合稍有不同。

  • 专用集合。

这些集合都具有专门的用途,通常用于处理特定的元素类型,如 StringDictionary

选择集合类时务必要小心。因为每一集合都有其自身的功能,因此每一集合也就具有其自身的限制。集合的专用性越强,其限制也就越多。有关选择集合的提示,请参见 选择集合类

常用的集合类型 

集合类型是数据集合的常见变体,例如哈希表、队列、堆栈、字典和列表。

集合基于 ICollection 接口、 IList 接口、 IDictionary 接口,或其泛型集合中的相应接口。 IList 接口和 IDictionary 接口都是从 ICollection 接口派生的;因此,所有集合都直接或间接基于 ICollection 接口。在基于 IList 接口的集合中(如 Array ArrayList List )或直接基于 ICollection 接口的集合中(如 Queue Stack LinkedList ),每个元素都只包含一个值。在基于 IDictionary 接口的集合中(如 Hashtable SortedList 类,或者 Dictionary SortedList 泛型类),每个元素都包含一个键和一个值。 KeyedCollection 类较为特别,因为它是带有嵌入键的值列表,因此它的行为既像列表又像字典。

泛型集合是设置强类型的最佳方式。不过,如果所用语言不支持泛型, System.Collections 命名空间中包含基集合,如 CollectionBase ReadOnlyCollectionBase DictionaryBase ,这些都是抽象基类,可以扩展这些抽象基类以创建强类型的集合类。

根据存储元素的方式、对元素进行排序的方式、执行搜索的方式以及进行比较的方式的不同,集合可能也有所不同。 Queue 类和 Queue 泛型类提供先进先出列表,而 Stack 类和 Stack 类提供后进先出列表。 SortedList 类和 SortedList 泛型类提供 Hashtable 类和 Dictionary 泛型类的排序的版本。 HashtableDictionary 中的元素只能通过元素的键访问;而 SortedList KeyedCollection 中的元素既可以通过元素的键访问,也可以通过元素的索引访问。所有集合中的索引都从零开始,不过 Array 除外,它允许使用索引不从零开始的数组。

数组集合类型 

Array 类不是 System.Collections 命名空间的一部分。但是,该类仍是一个集合,因为它基于 IList 接口。

Array 对象的秩是 Array 中的维数。一个 Array 可以具有一个或多个秩。

Array 的下限是其第一个元素的索引。一个 Array 可以具有任何下限。默认情况下它的下限为零,但在使用 CreateInstance 创建 Array 类的实例时可以定义不同的下限。

System.Collections 命名空间中的类不同, Array 具有固定的容量。若要增加容量,您必须创建具有所需容量的新 Array 对象,将旧 Array 对象中的元素复制到新对象中,然后删除该旧 Array

但是,只有系统和编译器可以从 Array 类显式派生。用户应使用其使用的语言所提供的数组构造。

ArrayList 和 List 集合类型 

ArrayList List 对象是较为复杂的数组。 ArrayList 类和 List 泛型类提供多数 System.Collections 类都提供的但 Array 类未提供的一些功能。例如:

  • Array 的容量是固定的,而 ArrayListList 的容量可根据需要自动扩充。如果更改了 Capacity 属性的值,则可以自动进行内存重新分配和元素复制。
  • ArrayListList 提供添加、插入或移除某一范围元素的方法。在 Array 中,您只能一次获取或设置一个元素的值。
  • 使用 Synchronized 方法很容易创建 ArrayList List 的同步版本。 Array 将实现同步的任务留给了用户。
  • ArrayListList 提供将只读和固定大小包装返回到集合的方法;而 Array 不提供。

另一方面, Array 提供了 ArrayListList 所缺少的某些灵活性。例如:

  • 可以设置 Array 的下限,但 ArrayListList 的下限始终为零。
  • Array 可以具有多个维度,而 ArrayListList 始终只是一维的。
  • 特定类型(不包括 Object )的 Array 的性能优于 ArrayList ,这是因为 ArrayList 的元素属于 Object 类型,所以在存储或检索值类型时通常发生装箱和取消装箱操作。不过,在不需要重新分配时(即最初的容量十分接近列表的最大容量), List 的性能与同类型的数组十分相近。

需要数组的大多数情况都可以改为使用 ArrayListList ;它们更容易使用,并且一般与相同类型的数组具有相近的性能。

Array 位于 System 命名空间中; ArrayList 位于 System.Collections 命名空间中; List 位于 System.Collections.Generic 命名空间中。

Hashtable 和 Dictionary 集合类型 

Hashtable 类和 Dictionary 泛型类实现 IDictionary 接口。 Dictionary 泛型类还实现 IDictionary 泛型接口。因此,这些集合中的每个元素都是一个键/值对。

Hashtable 对象由包含集合元素的存储桶组成。存储桶是 Hashtable 中各元素的虚拟子组,与大多数集合中进行的搜索和检索相比,存储桶可令搜索和检索更为便捷。每一存储桶都与一个哈希代码关联,该哈希代码是使用哈希函数生成的并基于该元素的键。

哈希函数是基于键返回数值哈希代码的算法。键是正被存储的对象的某一属性的值。哈希函数必须始终为相同的键返回相同的哈希代码。一个哈希函数能够为两个不同的键生成相同的哈希代码,但从哈希表检索元素时,为每一唯一键生成唯一哈希代码的哈希函数将令性能更佳。

Hashtable 中用作元素的每一对象必须能够使用 GetHashCode 方法的实现为其自身生成哈希代码。但是,还可以通过使用接受 IHashCodeProvider 实现作为参数之一的 Hashtable 构造函数,为 Hashtable 中的所有元素指定一个哈希函数。

在将一个对象添加到 Hashtable 时,它被存储在存储桶中,该存储桶与匹配该对象的哈希代码的哈希代码关联。在 Hashtable 内搜索一个值时,将为该值生成哈希代码,并且搜索与该哈希代码关联的存储桶。

例如,一个字符串的哈希函数可以采用该字符串中每一字符的 ASCII 代码并它们添加到一起来生成一个哈希代码。字符串“picnic”将具有与字符串“basket”的哈希代码不同的哈希代码;因此,字符串“picnic”和“basket”将处于不同的存储桶中。与之相比,“stressed”和“desserts”将具有相同的哈希代码并将处于相同的存储桶中。

Dictionary 类与 Hashtable 类的功能相同。对于值类型,特定类型(不包括 Object )的 Dictionary 的性能优于 Hashtable ,这是因为 Hashtable 的元素属于 Object 类型,所以在存储或检索值类型时通常发生装箱和取消装箱操作。

SortedList 和 SortedDictionary 集合类型 

System.Collections.SortedList 类、 System.Collections.Generic.SortedList 泛型类和 System.Collections.Generic.SortedDictionary 泛型类类似于 Hashtable 类和 Dictionary 泛型类,因为它们也实现 IDictionary 接口,但是它们以基于键的排序顺序维护元素,没有哈希表的 O(1) 插入和检索特性。这三个类具有若干共性:

注意

非泛型 SortedList 类在被枚举时返回 DictionaryEntry 对象,而两个泛型类则返回 KeyValuePair 对象。

下表列举两个排序的列表类与 SortedDictionary 类之间的一些区别。

SortedList 非泛型类和 SortedList 泛型类

SortedDictionary 泛型类

返回键和值的属性是有索引的,从而允许高效的索引检索。

无索引的检索。

检索的运算复杂度为 O(log n)。

检索的运算复杂度为 O(log n)。

插入和移除的运算复杂度一般为 O(n);但是,对于已经处于排序顺序的数据,插入操作的运算复杂度为 O(1),因此每个元素都被添加到列表的末尾。(这假设不需要调整大小。)

插入和移除的运算复杂度为 O(log n)。

SortedDictionary 使用更少的内存。

SortedList 非泛型类和 SortedList 泛型类使用更多内存。

注意

对于包含自己的键的值(例如,包含雇员 ID 编号的雇员记录),可以通过从 KeyedCollection 泛型类派生创建带键的集合,该集合具有列表的一些特征和字典的一些特征。

堆栈集合类型 

Stack 类和 Stack 泛型类都是后进先出集合类,可以实现 ICollection 接口。 Stack 泛型类还实现 ICollection 泛型接口。

当需要临时存储信息时(也就是说,可能想在检索了元素的值后放弃该元素),堆栈和队列都很有用。如果需要按照信息存储在集合中的顺序来访问这些信息,请使用 Queue 。如果需要以相反的顺序访问这些信息,请使用 Stack

Stack 常用于在调用其他过程期间保留变量状态。

可以对 Stack 及其元素执行三种主要操作:

  • Push 可在 Stack 的顶部插入一个元素。
  • Pop 可在 Stack 的顶部移除一个元素。
  • Peek 可返回处于 Stack 顶部的元素,但不将其从 Stack 上移除。

Queue 类和 Queue 泛型类都是先进先出集合类,它们实现 ICollection 接口和 ICollection 泛型接口。

当需要临时存储信息时(也就是说,可能想在检索了元素的值后放弃该元素), Queue Stack 类以及 Queue Stack 泛型类都很有用。如果需要按照信息存储在集合中的顺序来访问这些信息,请使用 Queue 。如果需要以相反的顺序访问这些信息,请使用 Stack

可以对 Queue 及其元素执行三种主要操作:

  • Enqueue 将一个元素添加到 Queue 的末尾。
  • DequeueQueue 的开始处移除最旧的元素。
  • PeekQueue 的开始处返回最旧的元素,但不将其从 Queue 中移除。

选择集合类

一定要谨慎选择 System.Collections 类。选用错误的类型可能限制您使用集合。

考虑以下问题:

  • 您是否需要一个序列列表,其中的元素通常在检索其值后被放弃?
    • 如果需要,那么在需要先进先出 (FIFO) 行为时请考虑使用 Queue 类或 Queue 泛型类。在需要后进先出 (LIFO) 行为时请考虑使用 Stack 类或 Stack 泛型类。
    • 如果不需要,请考虑使用其他集合。
  • 是否需要以某种顺序访问元素,例如 FIFO、LIFO 或随机访问?
    • Queue 类和 Queue 泛型类提供 FIFO 访问。
    • Stack 类和 Stack 泛型类提供 LIFO 访问。
    • LinkedList 泛型类允许从开头到末尾或从末尾到开头按顺序访问。
    • 其余的集合提供随机访问。
  • 是否需要通过索引访问每一元素?
  • 每一元素将包含一个值、一个键和一个值的组合还是一个键和多个值的组合?
    • 一个值:使用任何基于 IList 接口或 IList 泛型接口的集合。
    • 一个键和一个值:使用任何基于 IDictionary 接口或 IDictionary 泛型接口的集合。
    • 带有嵌入的键的一个值:使用 KeyedCollection 泛型类。
    • 一个键和多个值:使用 NameValueCollection 类。
  • 是否需要用与输入元素方式不同的方式对元素排序?
    • Hashtable 类按其元素的哈希代码对元素排序。
    • SortedList 类以及 SortedDictionarySortedList 泛型类根据 IComparer 接口和 IComparer 泛型接口的实现按键对元素排序。
    • ArrayList 提供 Sort 方法,该方法接受 IComparer 实现作为参数。其对应的泛型类( List 泛型类)提供 Sort 方法,该方法接受 IComparer 泛型接口的实现作为参数。
  • 是否需要信息的快速搜索和检索?
    • 对于小集合(10 项或更少), ListDictionaryHashtable 快。 SortedDictionary 泛型类提供比 Dictionary 泛型类更快的查找。
  • 是否需要只接受字符串的集合?
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
此为完整版去密码锁定版,可自由编辑打印,共三部分,此为I部分 原书名: Microsoft Visual C# 2010 Step by Step 原出版社: Microsoft Press 作者: (英)John Sharp 译者: 周靖 丛书名: 微软技术丛书 出版社:清华大学出版社 ISBN:9787302234289 上架时间:2010-9-6 出版日期:2010 年8月 开本:16开 页码:652 版次:1-1 所属分:计算机 > 软件与程序设计 > C# 内容简介 书籍 计算机书籍   c#作为微软的旗舰编程语言,深受程序员喜爱,是他们编写高效应用程序的首选语言。visual c# 2010新增了大量可圈可点的丰富特性,本书围绕着基础知识和这些新特性全面介绍了如何利用visual studio 2010和.net framework 4.0编写应用程序。书中沿袭深受读者欢迎的step by step风格,通过丰富的练习引导读者逐步构建windows应用程序,访问sql server数据库,开发asp.net web应用程序,创建并使用web服务等。   全书共29章,结构清晰,叙述清楚。所有练习均在visual studio 2010简体中文版上进行过全面演练。无论是刚开始接触面向对象编程的新手,还是打算转移到c#的具有c,c++或者java基础的程序员,都可以从本书中吸取到新的知识。 作译者 john sharp,content master首席技术专家。content master隶属于cm集团,cm集团是英国一家从事技术文档创作和咨询的专业公司。john sharp是负责net framework和互操作性问题的专家,已经针对分布式系统、web服务和c#语言发布了大量相关的教程、白皮书和演示文档。他具有丰富 目录 第i部分 visual c#和visual studio 2010概述 第1章 欢迎进入c#编程世界 3 1.1 开始在visual studio 2010环境中编程 3 1.2 编写第一个程序 8 1.3 使用命名空间 12 1.4 创建图形应用程序 15 第1章快速参考 22 第2章 使用变量、操作符和表达式 25 2.1 理解语句 25 2.2 使用标识符 26 2.3 使用变量 27 2.3.1 命名变量 27 2.3.2 声明变量 28 2.4 使用基本数据型 28 2.4.1 未赋值的局部变量 29 2.4.2 显示基本数据型值 29 2.5 使用算术操作符 33 2.5.1 操作符和数据型 33 2.5.2 深入了解算术操作符 35 2.5.3 控制优先级 37 .2.5.4 使用结合性对表达式进行求值 38 2.5.5 结合性和赋值操作符 38 2.6 变量的递增和递减 39 2.7 声明隐式型的局部变量 40 第2章快速参考 42 第3章 方法和作用域 43 3.1 创建方法 43 3.1.1 声明方法 43 3.1.2 从方法返回数据 44 3.1.3 调用方法 46 3.2 使用作用域 48 3.2.1 定义局部作用域 48 3.2.2 定义的作用域 49 3.2.3 重载方法 50 3.3 编写方法 50 3.4 使用可选参数和命名参数 57 3.4.1 定义可选参数 58 3.4.2 传递命名参数 58 3.4.3 消除可选参数和命名参数的歧义 59 第3章快速参考 63 第4章 使用决策语句 65 4.1 声明布尔变量 65 4.2 使用布尔操作符 66 4.2.1 理解相等和关系操作符 66 4.2.2 理解条件逻辑操作符 66 4.2.3 短路求值 67 4.2.4 操作符的优先级和结合性总结 68 4.3 使用if语句来做出决策 68 4.3.1 理解if语句的语法 69 4.3.2 使用代码块来对语句进行分组 70 4.3.3 嵌套if语句 70 4.4 使用switch语句 75 4.4.1 理解switch语句的语法 75 4.4.2 遵守switch语句的规则 76 第4章快速参考 79 第5章 使用复合赋值和循环语句 81 5.1 使用复合赋值操作符 81 5.2 使用while语句 82 5.3 编写for语句 86 5.4 编写do语句 88 第5章快速参考 95 第6章 管理错误和异常 97 6.1 处理错误 97 6.2 尝试执行代码和捕捉异常 98 6.2.1 未处理的异常 99 6.2.2 使用多个catch处理程序 100 6.2.3 捕捉多个异常 100 6.3 使用checked和unchecked整数运算 104 6.3.1 编写checked语句 105 6.3.2 编写checked表达式 106 6.4 抛出异常 107 6.5 使用finally块 111 第6章快速参考 112 第ii部分 理解c#语言 第7章 创建并管理和对象 117 7.1 理解分 117 7.2 封装的目的 118 7.3 定义并使用 118 7.4 控制可访问性 119 7.4.1 使用构造器 120 7.4.2 重载构造器 121 7.5 理解静态方法和数据 128 7.5.1 创建共享字段 129 7.5.2 使用const关键字创建静态字段 130 7.5.3 静态 130 7.5.4 匿名 132 第7章快速参考 134 第8章 理解值和引用 135 8.1 复制值型的变量和 135 8.2 理解null值和可空型 139 8.2.1 使用可空型 140 8.2.2 理解可为空型的属性 141 8.3 使用ref和out参数 142 8.3.1 创建ref参数 142 8.3.2 创建out参数 143 8.4 计算机内存的组织方式 145 8.5 system.object 147 8.6 装箱 147 8.7 拆箱 148 8.8 数据型的安全转换 149 8.8.1 is操作符 150 8.8.2 as操作符 150 第8章快速参考 152 第9章 使用枚举和结构来创建值型 155 9.1 使用枚举 155 9.1.1 声明枚举 155 9.1.2 使用枚举 156 9.1.3 选择枚举文字常量值 157 9.1.4 选择枚举的基本型 157 9.2 使用结构 159 9.2.1 声明结构 161 9.2.2 理解结构和的区别 162 9.2.3 声明结构变量 163 9.2.4 理解结构的初始化 164 9.2.5 复制结构变量 167 第9章快速参考 170 第10章 使用数组和集合 171 10.1 什么是数组 171 10.1.1 声明数组变量 171 10.1.2 创建数组实例 172 10.1.3 初始化数组变量 173 10.1.4 创建隐式型的数组 173 10.1.5 访问单独的数组元素 174 10.1.6 遍历数组 175 10.1.7 复制数组 176 10.1.8 使用多维数组 177 10.1.9 使用数组来玩牌 178 10.2 什么是集合类 184 10.2.1 arraylist集合类 185 10.2.2 queue集合类 187 10.2.3 stack集合类 188 10.2.4 hashtable集合类 189 10.2.5 sortedlist集合类 190 10.2.6 使用集合初始化器 191 10.2.7 比较数组和集合 192 10.2.8 使用集合类来玩牌 192 第10章快速参考 195 第11章 理解参数数组 197 11.1 使用数组参数 199 11.1.1 声明params数组 200 11.1.2 使用params object[] 201 11.1.3 使用params数组 203 11.2 比较参数数组和可选参数 205 第11章快速参考 207 第12章 使用继承 207 12.1 什么是继承 207 12.2 使用继承 208 12.2.1 调用基构造器 209 12.2.2 的赋值 210 12.2.3 声明new方法 212 12.2.4 声明virtual方法 213 12.2.5 声明override方法 214 12.2.6 理解protected访问 217 12.3 理解扩展方法 222 第12章快速参考 225 第13章 创建接口和定义抽象 227 13.1 理解接口 227 13.1.1 定义接口 228 13.1.2 实现接口 228 13.1.3 通过接口来引用一个 230 13.1.4 使用多个接口 230 13.1.5 显式实现接口 230 13.1.6 接口的限制 232 13.1.7 定义和使用接口 233 13.2 抽象 241 13.3 密封 243 13.3.1 密封方法 243 13.3.2 实现并使用一个抽象 243 第13章快速参考 248 第14章 使用垃圾回收和资源管理 251 14.1 对象的生存期 251 14.1.1 编写析构器 252 14.1.2 为什么要使用垃圾回收器 254 14.1.3 垃圾回收器的工作机理 255 14.1.4 慎用析构器 255 14.2 资源管理 256 14.2.1 disposal方法 256 14.2.2 异常安全的disposal方法 257 14.2.3 using语句 257 14.2.4 从析构器中调用dispose方法 259 14.3 实现异常安全的disposal 260 第14章快速参考 263 第iii部分 创 建 组 件 第15章 实现属性以访问字段 267 15.1 使用方法来实现封装 267 15.2 什么是属性 269 15.2.1 使用属性 271 15.2.2 只读属性 271 15.2.3 只写属性 272 15.2.4 属性的可访问性 272 15.3 理解属性的局限性 273 15.4 在接口中声明属性 275 15.5 生成自动属性 277 15.6 使用属性来初始化对象 279 第15章快速参考 283 第16章 使用索引器 285 16.1 什么是索引器 285 16.1.1 没有使用索引器的例子 285 16.1.2 使用索引器的同一个例子 287 16.1.3 理解索引器的accessor 289 16.1.4 对比索引器和数组 290 16.2 接口中的索引器 292 16.3 在windows应用程序中使用索引器 293 第16章快速参考 297 第17章 中断程序流程并处理事件 299 17.1 声明和使用委托 299 17.1.1 自动化工厂的例子 300 17.1.2 不使用委托来实现工厂 300 17.1.3 使用委托来实现工厂 301 17.1.4 使用委托 303 17.2 lambda表达式和委托 308 17.2.1 创建方法适配器 308 17.2.2 将lambda表达式作为适配器使用 309 17.2.3 lambda表达式的形式 309 17.3 启用事件通知 311 17.3.1 声明事件 311 17.3.2 订阅事件 312 17.3.3 取消订阅事件 313 17.3.4 引发事件 313 17.4 理解wpf用户界面事件 313 第17章快速参考 319 第18章 泛型概述 321 18.1 object存在的问题 321 18.2 泛型解决方案 323 18.2.1 对比泛型与泛化 325 18.2.2 泛型和约束 325 18.3 创建泛型 325 18.3.1 二叉树理论 325 18.3.2 使用泛型构造二叉树 328 18.4 创建泛型方法 337 18.5 可变性和泛型接口 340 18.5.1 协变接口 341 18.5.2 逆变接口 343 第18章快速参考 345 第19章 枚举集合 347 19.1 枚举集合中的元素 347 19.1.1 手动实现枚举器 348 19.1.2 实现ienumerable接口 352 19.2 使用迭代器来实现枚举器 354 19.2.1 一个简单的迭代器 354 19.2.2 使用迭代器为tree(titem) 定义枚举器 356 第19章快速参考 358 第20章 使用查询表达式来查询内存中的数据 361 20.1 什么是语言集成查询 361 20.2 在c#应用程序中使用linq 362 20.2.1 选择数据 363 20.2.2 筛选数据 366 20.2.3 排序、分组和聚合数据 366 20.2.4 联接数据 368 20.2.5 使用查询操作符 370 20.2.6 查询tree(titem)对象中的数据 372 20.2.7 linq和推迟求值 377 第20章快速参考 380 第21章 操作符重载 383 21.1 理解操作符 383 21.1.1 操作符的限制 384 21.1.2 重载的操作符 384 21.1.3 创建对称操作符 385 21.2 理解复合赋值 387 21.3 声明递增操作符和递减操作符 388 21.4 比较结构和中的操作符 389 21.5 定义操作符对 390 21.6 实现操作符 391 21.7 理解转换操作符 397 21.7.1 提供内建转换 397 21.7.2 实现用户自定义的转换操作符 398 21.7.3 再论创建对称操作符 399 21.7.4 添加隐式转换操作符 399 第21章快速参考 402 第iv部分 操纵windows应用程序 第22章 windows presentation foundation概述 405 22.1 创建wpf应用程序 405 22.2 在窗体上添加控件 418 22.2.1 使用wpf控件 418 22.2.2 动态更改属性 425 22.3 处理wpf窗体中的事件 429 第22章快速参考 434 第23章 收集用户输入 437 23.1 菜单设计原则和样式 437 23.2 菜单和菜单事件 438 23.2.1 创建菜单 438 23.2.2 处理菜单事件 443 23.3 快捷菜单 449 23.4 windows通用对话框 453 23.5 增强wpf应用程序的响应能力 456 第23章快速参考 464 第24章 执行校验 467 24.1 验证数据 467 用户输入验证策略 467 24.2 示例:订票系统 468 24.2.1 使用数据绑定执行校验 469 24.2.2 改变校验时机 484 第24章快速参考 487 第v部分 管 理 数 据 第25章 查询数据库中的信息 491 25.1 使用ado.net查询数据库 491 25.1.1 northwind数据库 492 25.1.2 创建数据库 492 25.1.3 使用ado.net查询订单信息 494 25.2 使用linq to sql查询数据库 503 25.2.1 定义实体 503 25.2.2 创建并运行linq to sql查询 505 25.2.3 推迟取回和立即取回 507 25.2.4 联接表和创建关系 507 25.2.5 再论推迟取回和立即取回 511 25.2.6 定义自定义的datacontxt 512 25.2.7 用linq to sql查询订单信息 513 第25章快速参考 517 第26章 使用实体框架和数据绑定显示和编辑数据 519 26.1 通过实体框架进行数据绑定 520 26.2 通过数据绑定修改数据 534 26.2.1 更新现有数据 534 26.2.2 处理冲突的更新 535 26.2.3 添加和删除数据 537 第26章快速参考 545 第vi部分 使用visual studio 2010构建专业解决方案 第27章 任务并行库入门 549 27.1 为何使用并行处理来执行多任务处理 550 27.2 在桌面应用程序中实现多任务处理 551 27.2.1 任务、线程和线程池 552 27.2.2 创建、运行和控制任务 553 27.2.3 使用task实现并行处理 557 27.2.4 使用parallel对任务进行抽象 564 27.2.5 什么时候不使用parallel 568 27.2.6 从任务返回值 571 27.3 任务和ui线程一起使用 574 27.4 取消任务和处理异常 578 27.4.1 协作式取消的原理 578 27.4.2 使用aggregateexception处理任务异常 586 27.4.3 为canceled和faulted任务使用延续任务 589 第27章快速参考 590 第28章 执行并行数据访问 593 28.1 用plinq并行进行声明式 数据访问 593 28.1.1 用plinq增强遍历集合时的性能 594 28.1.2 指定plinq查询选项 598 28.1.3 取消plinq查询 598 28.2 同步并发的命令式数据访问 599 28.2.1 锁定数据 602 28.2.2 tpl提供的同步基元 603 28.2.3 取消和同步基元 609 28.2.4 并发集合类 609 28.2.5 使用并发集合和锁来实现线程安全的数据访问 611 第28章快速参考 620 第29章 创建和使用web服务 623 29.1 web服务的定义 623 29.2 web服务架构 624 29.2.1 soap web服务 625 29.2.2 rest web服务 627 29.3 构建web服务 628 29.3.1 创建productinformation soap web服务 628 29.3.2 soap web服务、客户端 和代理 635 29.3.3 消费productinformation soap web服务 636 29.3.4 创建productdetails rest web服务 641 28.3.5 使用productdetails rest web服务 647 第29章快速参考 651

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值