C# 巩固记录(六)

目录

C# 集合

ArrayList 动态数组

HasTable 哈希表

HashSet

SortedSet 

SortedList 排序列表 

Stack 堆栈

Query 队列 

BitArray 点阵列

 其它常用集合

C# 泛型

 泛型的特性

泛型委托 

 C# 匿名函数/匿名方法


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);
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值