目录
C# 集合
集合类(Collection)是专门用于数据存储和检索的类,类中提供了对栈(stack)、队列(queue)、列表(list)和哈希表(hash table)的支持。大多数集合类都实现了相同的接口。
常用的 System.Collection 命名空间的类:

ArrayList 动态数组
动态数组(ArrayList)代表了可被单独索引的对象的有序集合。动态数组基本上可以代替数组,唯一与数组不同的是,动态数组可以使用索引在指定的位置添加和移除指定的项目,动态数组会自动重新调整自身的大小。另外,动态数组允许在列表中进行动态内存分配、增加、搜索、排序等操作。有以下常用属性:

HasTable 哈希表
Hashtable(哈希表) 类表示根据键的哈希代码进行组织的键(key)/值(value)对的集合,可以使用键来访问集合中的元素。也就是说当您需要使用键来访问指定元素时,可以选择使用哈希表。以下是常用属性:

HashSet
-
无重复元素:
HashSet<T>中的元素是唯一的,不允许重复。如果尝试添加重复的元素,添加操作将失败,但不会抛出异常。 -
无序集合:
HashSet<T>中的元素没有特定的顺序。如果需要有序集合,可以使用SortedSet<T>。 -
高效查找:
HashSet<T>基于哈希表实现,因此查找、添加和删除操作的平均时间复杂度为O(1)。 -
线程不安全:
HashSet<T>不是线程安全的。如果需要在多线程环境中使用,需要手动同步。 -
可自定义哈希函数:可以通过实现
IEqualityComparer<T>接口来自定义哈希函数和相等性比较。
SortedSet
-
有序集合:
SortedSet<T>中的元素会自动按照某种顺序排列。默认情况下,它使用元素类型的自然顺序(例如,数字从小到大,字符串按字典顺序)。如果需要自定义排序规则,可以提供一个IComparer<T>实现。 -
无重复元素:
SortedSet<T>中的元素是唯一的,不允许重复。如果尝试添加重复的元素,添加操作将失败,但不会抛出异常。 -
高效查找:基于红黑树实现,
SortedSet<T>的查找、添加和删除操作的时间复杂度为 O(log n),这比基于哈希表的HashSet<T>稍慢,但仍然非常高效。 -
线程不安全:
SortedSet<T>不是线程安全的。如果需要在多线程环境中使用,需要手动同步。 -
支持范围操作:
SortedSet<T>提供了许多与范围相关的操作,例如获取某个范围内的元素、查找最小值和最大值等。
SortedList 排序列表
SortedList 类用来表示键/值对的集合,这些键/值对按照键值进行排序,并且可以通过键或索引访问集合中的各个项。
我们可以将排序列表看作是数组和哈希表的组合,其中包含了可以使用键或索引访问各项的列表。如果您使用索引访问各项,那么它就是一个动态数组(ArrayList),如果您使用键访问各项,那么它就是一个哈希表(Hashtable)。另外,集合中的各项总是按键值进行排序。以下是常用属性:

Stack 堆栈
堆栈(Stack)类表示一个后进先出的对象集合,当您需要对项目进行后进先出的访问时,则可以使用堆栈。向堆栈中添加元素称为推入元素,从堆栈中移除元素称为弹出元素。以下是常用属性:

Query 队列
队列(Queue 类)与堆栈类似,它代表了一个先进先出的对象集合,当您需要对项目进行先进先出访问时,则可以使用队列。向队列中添加元素称为入队(enqueue),从堆栈中移除元素称为出队(deque),以下是常用属性:

BitArray 点阵列
BitArray 类用来管理一个紧凑型的位值数组,数组中的值均为布尔类型,其中 true(1)表示此位为开启,false(0)表示此位为关闭。
当您需要存储位(英文名“bit”数据存储的最小单位,也可称为比特),但事先又不知道具体位数时,就可以使用点阵列。当需要访问点阵列中的元素时,可以使用整型索引从点阵列中访问指定元素,索引从零开始。常用属性如下:

其它常用集合
数组 Array :基本的数据结构,用于存储固定大小的同类型元素。它是一个值类型(struct),属于System命名空间。
List:是一个动态数组,可以动态调整大小,适合存储可变数量的元素。它属于System.Collections.Generic命名空间。与ArrayList区别
ArrayList
-
是一个非泛型集合,可以存储任意类型的对象。
-
元素类型为
object,因此存储时需要装箱(boxing)和拆箱(unboxing)。 -
性能稍逊于泛型集合,因为涉及到类型转换。
-
是较早的.NET集合框架的一部分,主要用于.NET Framework 2.0之前的版本。
List
-
是一个泛型集合,可以指定存储的元素类型。
-
不需要装箱和拆箱,性能更高。
-
提供了丰富的泛型方法和类型安全的操作。
-
是.NET Framework 2.0及更高版本中推荐使用的动态数组类型。
字典 Dictionary
字典是一种键值对集合,用于存储键和值的映射关系。它也属于System.Collections.Generic命名空间。字典与HasTable的区别
Dictionary<TKey, TValue>:
-
是一个泛型集合,在声明时需要指定键和值的类型。
-
提供类型安全的访问和操作,避免了类型转换的开销。
Hashtable:
-
是一个非泛型集合,键和值的类型都是
object。 -
不提供类型安全,访问时需要显式类型转换(装箱和拆箱)。
C# 泛型
泛型(Generic)是一种规范,它允许我们使用占位符来定义类和方法,编译器会在编译时将这些占位符替换为指定的类型,利用泛型的这一特性我们可以定义通用类(泛型类)或方法(泛型方法)。
// 定义泛型类
class GenericClass<T>{
// 泛型方法
public GenericClass(T msg){
Console.WriteLine(msg);
}
}
class Demo
{
static void Main(string[] args){
GenericClass<string> str_gen = new GenericClass<string>("C语言中文网");
GenericClass<int> int_gen = new GenericClass<int>(1234567);
GenericClass<char> char_gen = new GenericClass<char>('C');
Console.ReadKey();
}
}
//泛型方法
static void Swap<T>(ref T lhs, ref T rhs)
{
T temp;
temp = lhs;
lhs = rhs;
rhs = temp;
}
Swap<int>(ref a, ref b);
泛型的特性
可以将泛型看作是一种增强程序功能的技术,泛型类和泛型方法兼具可重用性、类型安全性和效率,这是非泛型类和非泛型方法无法实现的。泛型通常与集合以及作用于集合的方法一起使用,System.Collections.Generic 命名空间下就包含几个基于泛型的集合类。下面总结了一些关于泛型的特性:
- 使用泛型类型可以最大限度地重用代码、保护类型的安全性以及提高性能;
- 泛型最常见的用途是创建集合类;
- .NET 类库在 System.Collections.Generic 命名空间中包含几个新的泛型集合类,您可以使用这些类来代替 System.Collections 中的集合类;
- 您可以创建自己的泛型接口、泛型类、泛型方法、泛型事件和泛型委托;
- 您也可以对泛型类进行约束以访问特定数据类型的方法;
- 在泛型数据类型中所用类型的信息可在运行时通过使用反射来获取。
泛型委托
泛型委托能够最大限度的重用委托,减少委托定义
delegate T NumberChanger<T>(T n);
NumberChanger<int> nc1 = new NumberChanger<int>(AddNum);
C# 匿名函数/匿名方法
可以将匿名函数简单的理解为没有名称只有函数主体的函数。匿名函数提供了一种将代码块作为委托参数传递的技术,它是一个“内联”语句或表达式,可在任何需要委托类型的地方使用。匿名函数可以用来初始化命名委托或传递命名委托作为方法参数。无需在匿名函数中指定返回类型,返回值类型是从方法体内的 return 语句推断出来的。主要用于简化代码逻辑
delegate void NumberChanger(int n);
...
NumberChanger nc = delegate(int x)
{
Console.WriteLine("Anonymous Method: {0}", x);
};
&spm=1001.2101.3001.5002&articleId=146184635&d=1&t=3&u=ff8a4e8938c84a10b4ddd64eee9af86f)
615

被折叠的 条评论
为什么被折叠?



