泛型与集合
number1killer
软件测试
展开
-
泛型笔记之类型模板及其局限性
泛型本质上是「代码类型样版」,可讓開發人員定義类型安全性(在C#的程序中拆装箱和强制类型转换越少,其类型安全性越高)数据結構, 而不需要指定實際数据類型。 泛型将类型参数的概念引入 .NET Framework,使得我们可以这样设计类和方法:在客户端代码声明并初始化这些类和方法之前,这些类和方法会延迟指定一个或多个类型。 //因为不能直接对泛型类型的数据使用运算相加的操作,所以编译器输出了“未...原创 2018-08-27 13:54:29 · 229 阅读 · 0 评论 -
协变接口与逆变接口的4个不同点
隐式转换的范围不同协变接口:可以将“类型范围”比他更小的引用对象(实现了该接口的类的对象而非接口类型的对象)赋给协变接口的引用对象。逆变接口:可以将“类型范围”比他更大的引用对象(实现了该接口的类的对象而非接口类型的对象)赋给逆变接口的引用对象。对象。...原创 2018-12-07 17:46:56 · 288 阅读 · 0 评论 -
泛型方法的设计与应用1(静态与引用类型的设计)
可以通过,泛型类的类型参数的实例类型来指定泛型方法的实例返回值类型,从而实现引用类型泛型方法的调用。之前在《C#泛型方法和普通方法的性能实例解析》一文中,演示和解析了泛型方法的一些强大的性能。现在让我们再一起来回顾一下:强类型的元素也可以理解为”更早识别类型”。而这也是称之为强类型的原因,因为在编译时没有办法告诉我们列表中(元素)数据的实际类型是什么,泛型通过提供额外的信息来解...原创 2018-12-03 11:27:53 · 198 阅读 · 0 评论 -
C#方法与方法的环回调用
所谓方法与方法间的环回调用就是方法A调用方法B,而方法A本身又调用方法B;这样方法A与方法B之间的调用就构成了一个闭合的环路。原创 2018-11-26 17:29:50 · 230 阅读 · 0 评论 -
C# HashSet<T>类IntersectWith()方法、Add()方法实例解析
本文部分资料来源于书籍和网摘/// HashSet<T>类专为集合操作优化,包括判断数据项是否集合成员、生成合并集、交集等。/// IntersectWith方法:“修改”当前的 HashSet<T> 对象,以使其仅包含该对象和指定集合中存在的元素。/// 这种操作是破坏性的,因为该方法会用一个 “新集合” 覆盖 “原始” HashSet<T> 对象...原创 2018-11-21 17:48:22 · 2655 阅读 · 0 评论 -
C# HashSet<T>类UnionWith()方法实例解析
本文部分资料来源于书籍和网摘HashSet<T>类专为集合操作优化,包括判断数据项是否集合成员、生成合并集、交集等。/// UnionWith方法:修改当前 HashSet<T> 对象以使其包含存在于该对象中、指定集合中或两者中的所有元素。/// 这种操作是破坏性的,因为该方法会用一个 “新集合” 覆盖 “原始” HashSet<T> 对象的内容。...原创 2018-11-21 17:53:06 · 3215 阅读 · 2 评论 -
C# HashSet<T>类3个破坏性方法实例解析
本文部分注释来源于书籍和网摘散列表(Hash table,也叫哈希表),是根据关键字(Key value)而直接访问在内存存储位置的数据结构。它通过计算一个关于键值的函数,将所需查询的数据映射到表中一个位置来访问记录,也就是说,哈希查表存储数据时就是使用映射函数将键映射成索引,这加快了查找速度。这种映射函数称作散列函数(也就是哈希函数);存放记录的数组称做散列表。 我们知道...原创 2018-11-22 17:04:09 · 970 阅读 · 0 评论 -
C# HashSet<T>类中增、删、清除方法(Add、Remove、Clear)实例解析
本文部分注释来源于书籍和网摘散列表(Hash table,也叫哈希表),是根据关键字(Key value)而直接访问在内存存储位置的数据结构。它通过计算一个关于键值的函数,将所需查询的数据映射到表中一个位置来访问记录,也就是说,哈希查表存储数据时就是使用映射函数将键映射成索引,这加快了查找速度。这种映射函数称作散列函数(也就是哈希函数);存放记录的数组称做散列表。 我们知道...原创 2018-11-22 17:06:56 · 4767 阅读 · 0 评论 -
HashSet类求集合与集合之间是否为真子集或真超集
本文部分注释来源于书籍和网摘散列表(Hash table,也叫哈希表),是根据关键字(Key value)而直接访问在内存存储位置的数据结构。它通过计算一个关于键值的函数,将所需查询的数据映射到表中一个位置来访问记录,也就是说,哈希查表存储数据时就是使用映射函数将键映射成索引,这加快了查找速度。这种映射函数称作散列函数(也就是哈希函数);存放记录的数组称做散列表。 /// ...原创 2018-11-23 17:18:03 · 848 阅读 · 0 评论 -
泛型方法的设计与应用2(参数的限制与设计)
设计泛型类或方法时,如果要对泛型成员执行除简单赋值之外的任何操作或调用 System.Object 不支持的任何方法,则必须对该类型参数应用约束。包括但不仅限于:由于具体类型的参数可能无法用于实现方法所以对泛型方法的参数进行限制: 由于具体的参数值可能不符合方法对参数的(数值大小、字符串长度等)要求所以对泛型方法的参数进行限制(这个相信大家都懂)。 ...原创 2018-12-04 09:52:44 · 254 阅读 · 0 评论 -
C# foreach(迭代语句标识符)语句译文上
foreach语句语法: foreach_statement foreach语句 局部变量类型 标识符 in 表达式(例如:数组对象) : 'foreach' '(' local_variable_type identifier 'in' expression ')' embedded_statement 嵌入式语句;The ...翻译 2018-09-07 11:25:49 · 324 阅读 · 0 评论 -
foreach 语句的使用限制与解决方案
所以,不具备公共 GetEnumerator 方法的类型是无法使用foreach来进行遍历的。先来看看官网上的说明:foreach语句可应用于满足以下条件的任何类型的实例:具有公共无参数 GetEnumerator 方法,其返回类型为类、结构或接口类型。 GetEnumerator 方法的返回类型具有公共 Current 属性和公共无参数 MoveNext 方法(其返回类型为 Boo...原创 2019-01-09 12:45:05 · 1276 阅读 · 0 评论 -
IEnumerator接口成员工作流程
本文部分内容来源于书籍和网摘。IEnumerator接口支持对非泛型集合的简单迭代。IEnumerator 是所有非泛型枚举器的基接口。 其泛型等效项是System.Collections.Generic.IEnumerator<T>接口。枚举器可用于读取集合中的数据,但不能用于修改基础集合。 ...原创 2019-01-07 11:55:44 · 281 阅读 · 0 评论 -
Yield return语句与return语句的4个不同点(上)
本文部分内容来源于书籍和网摘。return语句返回的是其所在方法的控制权,即终止该方法的此次执行;而迭代器方法运行到 yield return 语句时,会返回一个 expression,并保留当前在代码中的位置。 下次调用迭代器函数时,将从该位置重新开始执行。2、可以在同一个方法中同时使用多个yield return语句,同时返回多个值; 但是不能在同一个方法中用return语句同时...原创 2019-01-02 12:10:50 · 460 阅读 · 0 评论 -
Yield return语句与return语句的4个不同点(下)
3、return语句的返回值类型取决于方法的返回类型,如果方法是 void 类型,则 return 语句可以省略;而yield语句的返回值类型返回类型必须为 IEnumerable、IEnumerable<T>、IEnumerator 或 IEnumerator<T>。4、可以在Main()方法中使用return语句返回与Main()方法返回类型相同的数据,这和普通的方...原创 2019-01-10 17:56:23 · 554 阅读 · 0 评论 -
C#由“隐藏条件”导致的排序结果不同
我们可以看到Array.Sort()的排序结果是“错误”的,但是Sort()方法的排序结果则是正确的。咋看之下,似乎是Array.Sort()方法不适合用作string类型元素的排序。但实际上则是由于 " my"之中多了一个空格引起的,去掉空格之后两者的排序结果其实是相同的。...原创 2018-12-19 12:01:39 · 282 阅读 · 0 评论 -
var类型变量(隐式类型的局部强类型变量)
从 Visual C# 3.0 开始,在方法范围中声明的变量可以具有隐式类型 var。 隐式类型的本地变量是强类型变量(就好像您已经声明该类型一样),但由编译器确定类型。...原创 2018-12-18 11:02:40 · 589 阅读 · 0 评论 -
C#逆变接口实例和解析
ContraVarianceBody.inInterface<string> Instr = ObjClass;//逆变性 Console.WriteLine(Instr.outMethod("getIt"));//逆变接口常常用于获取数据并处理、转化成指定的类型 //协变接口常常用于返回、输出各种类型的数据...原创 2018-12-11 17:53:25 · 304 阅读 · 2 评论 -
C#泛型性能之List<T>列表与数组的排序性能差异
本文部分注解部分来源于书籍和官网网摘。装箱 和 拆箱 會影響性能能。但是,在编译时没有办法告诉我们列表中数据的实际类型是什么。这使得一些代码变得脆弱。泛型通过提供额外的信息来解决这个问题,每个列表中包含的数据类型将包含在内。 这里首先要注意的是,对泛型列表进行排序要比对非泛型列表要快。...原创 2018-12-14 12:03:03 · 1547 阅读 · 0 评论 -
HashSet类求集合与集合之间是否为子集或超集
本文部分注释来源于书籍和网摘散列表(Hash table,也叫哈希表),是根据关键字(Key value)而直接访问在内存存储位置的数据结构。它通过计算一个关于键值的函数,将所需查询的数据映射到表中一个位置来访问记录,也就是说,哈希查表存储数据时就是使用映射函数将键映射成索引,这加快了查找速度。这种映射函数称作散列函数(也就是哈希函数);存放记录的数组称做散列表。 /// ...原创 2018-11-23 17:15:12 · 408 阅读 · 0 评论 -
C#表达式主体方法实例和解析
尽管都是使用=>操作符但是表达式主体方法和Lambda表达式还是有很多不同的。 表达式主体方法适用于那些十分简单的方法,例如:执行单一任务或者返回计算结果,不涉及任何额外逻辑。 表达式主体方法和普通方法在功能和可声明的区间上其实并没有区别,只是语法简化了,也就是“语法糖”。...原创 2018-09-28 12:48:13 · 2106 阅读 · 0 评论 -
C#用泛型方法对三维阵列进行三维度排序
在C#中Array.Sort()函数是不能对二维数组进行排序的。那么,我们应该怎么对C#中的三维数组进行排序呢?话不多说,直接上代码:原创 2018-09-13 18:22:20 · 445 阅读 · 0 评论 -
C#用泛型方法对二维矩阵进行双维度排序
在C#中Array.Sort()函数是不能对二维数组进行排序的。那么,我们应该怎么对C#中的二维数组进行排序呢?话不多说,直接上代码:原创 2018-09-13 11:28:58 · 804 阅读 · 0 评论 -
C#用foreach语句输出泛型列表List<T>、非泛型列表ArrayList、数组的性能对比
不难看出用foreach遍历相同数据类型不同列表的元素,数组类型都是最快的;且不论是哪种类型的列表foreach对object型元素的遍历速度都是最快的(foreach就是通过迭代变量来引用迭代器中的元素的)。 ...原创 2018-09-07 11:29:53 · 1546 阅读 · 0 评论 -
C# String类笔记
The category of a character or a surrogate pair can be determined by calling the CharUnicodeInfo.GetUnicodeCategory method.可以通过调用CharUnicodeInfo.GetUnicodeCategory方法来确定字符或配对的代理的类别。 即字符串实际上就是一种异构集合,而...原创 2018-09-03 18:09:48 · 296 阅读 · 0 评论 -
C#泛型方法和普通方法的性能实例解析
而这一切不仅仅适用于列表,还适用于方法。也因此泛型方法在泛型类中不仅仅具备强大的重用性,而且还具备更强大的性能。强类型的元素”更早识别类型”。而这也是称之为强类型的原因,因为在编译时没有办法告诉我们列表中数据的实际类型是什么,泛型通过提供额外的信息来解决这个问题,每个列表中包含的数据类型将包含在内。...原创 2018-09-11 12:04:44 · 705 阅读 · 4 评论 -
C#泛型列表List<T>、非泛型列表ArrayList、数组的排序性能对比
对值类型的元素进行排序:速度最慢的是ArrayList、其次是数组,速度最快的是List<T>;对引用类型的元素进行排序:速度最慢的是数组、其次是List<T>,速度最快的是ArrayList....原创 2018-09-11 12:01:53 · 834 阅读 · 0 评论 -
C# Object类源码注释翻译
// Internal methodtable used to instantiate the "canonical" methodtable for generic instantiations.内部方法列表用于实例化“规范化”的方法列表来具现化(具体化)泛型实例。// The name "__Canon" will never been seen by users bu...原创 2018-08-31 11:15:34 · 674 阅读 · 3 评论 -
泛型性能之List<T>列表与非泛型列表ArrayList排序
ArrayList类被设计用于操控(hold,控制)对象的异构集合。通过对比,我们不难发现:对值类型的元素进行排序,List<T>明显更快;而对于引用类型的元素进行排序,则是ArrayList明显更快。但是并不是对所有的泛型列表进行排序都比非泛型列表更快的,本文主要就是讨论这个问题(本文部分文本摘自官网)。...原创 2018-08-28 18:04:55 · 410 阅读 · 6 评论 -
C#用泛型方法对四维数组进行四维度排序
在C#中Array.Sort()函数是不能对二维数组进行排序的。那么,我们应该怎么对C#中的四维数组进行四维度排序呢?话不多说,直接上代码:原创 2018-09-14 12:07:29 · 1043 阅读 · 0 评论 -
C#协变接口实例与解析
本文部分说明来自书籍和网摘。接口成员实例化之后该接口成员的“返回值类型”和“参数类型”不能改变的接口,称之为不变量(接口中的)。其他常见的不变量还有常量(即常数)、const静态字段(即const静态变量)等。不能将不变量接口的(引用)对象赋给任何其他接口的(引用)对象。也就是说泛型不变量接口其实就是一种“普通”的接口,只不过加了一个泛型类型参数。协变和逆变正是建立在“不变”的...原创 2018-09-25 12:42:09 · 399 阅读 · 0 评论 -
C# SortedList(Tkey,TValue)集合类解析与实例
SortedList<TKey,TValue>类表示键/值对的集合,这些键值对按键排序并可按照键和索引访问。 SortedList<TKey,TValue>和 Dictionary<Tkey,TValue>类很类似,都允许将键和值关联。主要区别是,前者的键数组总是排好序的(不然也不会叫SortedList了)。在 SortedList<TKey,TVa...原创 2018-10-05 17:43:43 · 1385 阅读 · 4 评论 -
C# Dictionary(Tkey,TValue)集合类解析与实例
本文部分注释部分来源于书籍和官网网摘。Dictionary<Tkey,TValue>类在内部维护两个数组。一个存储要从其映射的键,另一个存储映射到的值。因此,其他语言一般把这称为关联数组。 Dictionary<Tkey,TValue>类表示键和值的集合。类型参数:TKey字典中的键的类型。 TValue字典中的值的类型。...原创 2018-10-05 17:41:01 · 1631 阅读 · 0 评论 -
C#栈(后进先出)队列实现与解析
本文部分注释部分来源于书籍和官网网摘。Stack<>集合类实现了【后入先出的栈】(也是一种线性表),所有的插入(push)和删除(pop)(通常还有所有的访问)都在顶部进行。Queue<>集合类实现了【先入先出队列】(也是一种线性表),所有的插入(Enqueue)都在队列(表)的队列最末端 进行,所有删除(Dequeue(),通常还有所有的访问)都在队列(表)的队...原创 2018-10-05 11:49:52 · 3741 阅读 · 0 评论 -
C# Queue<T>集合类(先进先出队列)解析与实例
Queue<T>Class 表示对象的先进先出(FIFO)集合。使用Queue<T>如果需要访问存储在集合中的相同顺序(进出同序)中的信息。 使用Stack<T>如果你需要按 后进先出(LIFO)的顺序访问的信息。使用ConcurrentQueue<T>或ConcurrentStack<T>如果你需要同时从多个线程访问...原创 2018-10-04 17:56:24 · 10699 阅读 · 0 评论 -
C# LinkedList<T>集合类解析与实例
本文部分注释部分来源于书籍和官网网摘。LinkedList<T> 是一个通用的链接的列表。 它支持枚举器和实现ICollection接口,与.NET Framework 中的其他集合类保持一致。 LinkedList<T> 提供类型的单独节点LinkedListNode<T>,因此插入和删除是 o (1) 的操作。...原创 2018-10-04 11:40:18 · 2320 阅读 · 0 评论 -
C# List<T>集合类解析与实例
本文部分注释部分来源于书籍和官网网摘。命名空间:System.Collections.Generic表示可通过索引访问的对象的强类型列表。 提供用于对列表进行搜索、排序和操作的方法。...原创 2018-10-04 11:37:58 · 1744 阅读 · 1 评论 -
C#泛型委托实例
本文部分注释部分来源于书籍和官网网摘。 委托可以定义它自己的类型参数。 Generic delegates are especially useful in defining events based on the typical design pattern because the sender argument can be strongly typed and no longer h...原创 2018-10-04 11:34:08 · 1166 阅读 · 0 评论 -
C#泛型接口中的不变量
本文部分说明来自书籍和网摘。接口成员实例化之后该接口成员的“返回值类型”和“参数类型”不能改变的接口,称之为不变量(接口中的)。其他常见的不变量还有常量(即常数)、const静态字段(即const静态变量)等。不能将不变量接口的(引用)对象赋给任何其他接口的(引用)对象。也就是说泛型不变量接口其实就是一种“普通”的接口,只不过加了一个泛型类型参数。协变和逆变正是建立在“不变”的...原创 2018-09-21 12:12:58 · 400 阅读 · 0 评论 -
C# find方法、findLast方法、findAll方法实例解析
本文部分内容来源于书籍和网摘。List<T>.Find(Predicate<T>) Method 命名空间:System.Collections.Generic 搜索与指定谓词所定义的条件相匹配的元素,并返回整个 List<T> 中的第一个匹配元素。 List<T>.FindAll(Predicate<T>) Method检索...原创 2019-01-15 16:43:21 · 10064 阅读 · 0 评论