c# list/task/ dictionary/委托简单到高级使用

news2024/11/24 5:48:50

在 C# 编程中,ListTaskDictionary 和委托(Delegates)是常用的数据结构和功能特性,它们在处理集合、异步编程、键值对存储以及事件和回调实现中扮演着重要角色。

C# List

List<T> 是 C# 中的一个泛型集合,它实现了 IList<T> 接口,用于存储一个可增长和缩减的对象序列。List<T> 提供了添加、删除、查找和排序元素的方法。

  • 创建 List:

    List<int> numbers = new List<int>();
  • 添加元素:

    numbers.Add(1); // 添加单个元素
    numbers.AddRange(new List<int> { 2, 3, 4 }); // 添加多个元素
  • 访问元素:

    int firstElement = numbers[0]; // 获取第一个元素
  • 遍历 List:

    foreach (int number in numbers)
    {
    Console.WriteLine(number);
    }

C# Task

Task 是 C# 中用于异步编程的一个核心组件,它表示一个异步操作的最终完成。Task 可以返回一个结果或者不返回任何结果(Task 类型),并且可以与其他 Task 对象组合和等待它们的完成。

  • 创建 Task:

    Task.Run(() => {
    // 异步执行的代码
    });
  • 等待 Task 完成:

    await Task.Run(() => {
    // 异步执行的代码
    });
  • 组合 Task:

    Task.WhenAll(tasks); // 等待多个 Task 完成

C# Dictionary

Dictionary<TKey, TValue> 是一个泛型集合,用于存储键值对。它实现了 IDictionary<TKey, TValue> 接口,提供了快速的查找、插入和删除操作。

  • 创建 Dictionary:

    Dictionary<string, int> ages = new Dictionary<string, int>();
  • 添加元素:

    ages.Add("Alice", 25); // 添加键值对
  • 访问元素:

    int age = ages["Alice"]; // 获取特定键的值
  • 遍历 Dictionary:

    foreach (KeyValuePair<string, int> pair in ages)
    {
    Console.WriteLine($"{pair.Key}: {pair.Value}"); } 
 

C# 委托委托(Delegates

  • 是 C# 中一种类型安全的函数指针,

  • 它可以引用具有特定参数列表和返回类型的方法。

  • 委托在实现回调、事件处理以及线程间的通信中非常有用。

  • - **定义委托:

  • public delegate void MyDelegate(string message);

  • 创建委托实例:

  • MyDelegate del = new MyDelegate(ShowMessage);

  • 调用委托:

  • del("Hello, World!"); // 调用委托,

输出消息 

  public event MyDelegate OnMessageReceived;  OnMessageReceived?.Invoke("New message"); // 触发事件

深入探讨 C# 中的 ListTaskDictionary 和委托的高级用法和一些最佳实践。

高级用法和最佳实践 - List

  1. 使用 LINQ 查询 List: LINQ (Language Integrated Query) 提供了一种强大的查询机制,可以用来对 List 进行复杂的筛选、排序和转换操作。

var evenNumbers = numbers.Where(n => n % 2 == 0).ToList();
  1. 异步操作 List: 当处理大量数据时,可以使用 async 和 await 关键字结合 Task 来异步执行操作,避免阻塞主线程。

await Task.Run(() => {
numbers.Sort();
});

高级用法和最佳实践 - Task

  1. 链式 Task 调用: 可以使用 ContinueWith 方法来创建任务的链式调用,实现复杂的异步工作流。

Task.Run(() => {
// 第一个任务
}).ContinueWith(prevTask => {
// 第二个任务,依赖于第一个任务的结果
});

  1. 取消任务: 通过 CancellationToken 可以取消正在执行的任务,避免资源浪费。

var cancellationTokenSource = new CancellationTokenSource();
Task.Run(() => {
while (!cancellationTokenSource.Token.IsCancellationRequested) {
// 执行长时间运行的任务
}
}, cancellationTokenSource.Token);
// 在需要时取消任务
cancellationTokenSource.Cancel();

高级用法和最佳实践 - Dictionary

  1. 使用计算属性: 当需要根据某些条件动态计算值时,可以使用计算属性。

ages["Alice"] = age => age + 1; // 假设 age 是一个外部变量
  1. 初始化 Dictionary: 可以使用对象初始化器来简化 Dictionary 的初始化过程。

Dictionary<string, int> ages = new Dictionary<string, int>
{
{"Alice", 25},
{"Bob", 30}
};

高级用法和最佳实践 - 委托

  1. 使用 lambda 表达式简化委托: lambda 表达式提供了一种简洁的方式来创建委托实例。

Action<string> printMessage = message => Console.WriteLine(message);
printMessage("Hello, World!");
  1. 多播委托: 多播委托允许将多个方法链接到同一个委托实例,当调用委托时,所有链接的方法都会被执行。

Action<string> multicastDelegate = message => Console.WriteLine(message);
multicastDelegate += (msg) => MessageBox.Show(msg);
multicastDelegate("Hello, World!"); // 会在控制台输出并显示消息框
  1. 使用委托实现事件: 委托在实现事件和回调机制时非常有用,可以轻松地管理和触发多个订阅者。

public delegate void DataReceivedEventHandler(object sender, string data);
public event DataReceivedEventHandler DataReceived;

protected virtual void OnDataReceived(string data)
{
DataReceived?.Invoke(this, data);
}

通过这些高级用法和最佳实践,你可以更有效地利用 C# 中的 ListTaskDictionary 和委托,编写出更加高效、灵活和可维护的代码。这些特性是 C# 强大功能的一部分,能够帮助你解决复杂的编程问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1583345.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MySQL基础(下)

函数 函数 是指一段可以直接被另一段程序调用的程序或代码 字符串函数 SELECT 函数(参数); --concat 连接 select concat(Hello , MySQL);--lower 将所有大写转换为小写 select lower(Hello); --upper 将所有小写转换为大写 select upper(Hello);--lpad 左填充 select lpad(0…

从零开始学习的ai教程视频,如何入手?

个人认为小白想零基础学习ai应该从理论和实操两个方面入手。理论是支撑实践的前提&#xff0c;只有以一种全局观角度了解ai才能实现从熟练使用ai到有自我意识的用ai创作。 接下来将会简单介绍一些理论免费学习网站和软件&#xff08;一笔带过&#xff0c;不重点&#xff09;&a…

刷题之动态规划-回文串

前言 大家好&#xff0c;我是jiantaoyab&#xff0c;开始刷动态规划的回文串类型相关的题目 动态规划5个步骤 状态表示 &#xff1a;dp数组中每一个下标对应值的含义是什么>dp[i]表示什么状态转移方程&#xff1a; dp[i] 等于什么1 和 2 是动态规划的核心步骤&#xff0c;…

OneForAll安装使用

OneForAll简介 OneForAll是一款功能强大的子域收集工具 原项目地址&#xff1a;GitHub - shmilylty/OneForAll: OneForAll是一款功能强大的子域收集工具 gitee项目地址&#xff1a;OneForAll: OneForAll是一款功能强大的子域收集工具 # 安装Python Windows系统安装python参…

C++ //练习 11.23 11.2.1节练习(第378页)中的map以孩子的姓为关键字,保存他们的名的vector,用multimap重写此map。

C Primer&#xff08;第5版&#xff09; 练习 11.23 练习 11.23 11.2.1节练习&#xff08;第378页&#xff09;中的map以孩子的姓为关键字&#xff0c;保存他们的名的vector&#xff0c;用multimap重写此map。 环境&#xff1a;Linux Ubuntu&#xff08;云服务器&#xff09;…

制作一个RISC-V的操作系统十-Trap和Exception(流 mtvec mepc mcause mtval mstatus trap完整流程)

文章目录 流mtvecmepcmcausemtvalmstatustrap 初始化trap的top half&#xff08;硬件完成&#xff09;trap的bottom half&#xff08;软件完成&#xff09;从trap返回代码实现 流 控制流&#xff1a;程序控制的执行流 trap分为中断和异常 mtvec base&#xff1a;存储trap入…

【Keil5-编译4个阶段】

Keil5-编译 ■ GCC编译4个阶段■ 预处理->编译->汇编->链接■ GNU工具链开发流程图■ armcc/armasm&#xff08;编译C和汇编&#xff09;■ armlink &#xff08;链接&#xff09;■ armar &#xff08;打包&#xff09;■ fromelf &#xff08;格式转换器&#xff09…

在B站看课的进度助手

效果 代码 BilibiliVideoDurationCrawler import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org.jsoup.select.Elements; import java.io.IOException; import java.text.ParseException; import java.util.ArrayList; imp…

简单用Nodejs + express 编写接口

文章目录 get接口示范post接口示范注意点 准备工作可以看上一篇文章&#xff1a;文章链接》》 get接口示范 app.get(/, (req, res) > {res.send("Hello World"); })因为是get接口&#xff0c;所以可以直接在浏览器上请求&#xff08;端口地址接口名&#xff09;…

Java 二叉数(1)

一、认识树 树是一种非线性的数据结构&#xff0c;它是由n&#xff08;n>0&#xff09;个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树&#xff0c;也就是说它是根朝上&#xff0c;而叶朝下的。它具有以下的特点&#xff1a; 有一个特殊的…

零基础入门NLP - 新闻文本分类比赛方案分享 nano- Rank1

nano- 康一帅 简介 环境 Tensorflow 1.14.0Keras 2.3.1bert4keras 0.8.4 文件说明 EDA&#xff1a;用于探索性数据分析。data_utils&#xff1a;用于预训练语料的构建。pretraining&#xff1a;用于Bert的预训练。train&#xff1a;用于新闻文本分类模型的训练。pred&a…

Celery使用异步、定时任务使用

一、什么是Celery 1.1、celery是什么 Celery是一个简单、灵活且可靠的&#xff0c;处理大量消息的分布式系统&#xff0c;专注于实时处理的异步任务队列&#xff0c;同时也支持任务调度。 Celery的架构由三部分组成&#xff0c;消息中间件&#xff08;message broker&#xf…

网络安全加密算法---对称加密

三位同学一组完成数据的对称加密传输。 三位同学分别扮演图中 A、B 和 KDC 三个角色&#xff0c;说明 KA、KB&#xff0c;KAB 和发送的数据Data 的内容。 给出图中 2 和 3 中的数据&#xff0c;以及 Data 加密后的密文。可以完成多轮角色互换的通信 过程。其中一轮过程要求 K…

【Entity Framework】聊聊EF中键

【Entity Framework】聊聊EF中键 文章目录 【Entity Framework】聊聊EF中键一、概述二、配置主键2.1 约定配置主键2.2 单个属性配置为实体主键2.3 组合主键 三、主键名称四、键类型和值五、备用键 一、概述 键用作每个实体实例的唯一标识符。EF中的大多数实体都有一个键&#…

Vue2电商前台项目(三):完成Search搜索模块业务

目录 一、请求数据并展示 1.写Search模块的接口 2.写Vuex中的search仓库&#xff08;三连环&#xff09; 3.组件拿到search仓库的数据 用getters简化仓库中的数据 4.渲染商品数据到页面 5.search模块根据不同的参数获取数据展示 &#xff08;1&#xff09;把派发actions…

layui中对table表格内容鼠标移入显示 tips内容

要在Layui中的表格中实现鼠标移入显示Tips&#xff0c;你可以使用Layui的事件监听和Tips组件。 有两种实现方式&#xff01; 第一种是&#xff0c;通过自定义鼠标事件显示 tips。在渲染 table 时&#xff0c;对 filed 进行重构&#xff0c;增加相应的选择器标识&#xff0c;一…

冯喜运:4.10晚间黄金原油走势分析

黄金消息技术面分析&#xff1a;美国CPI年率创半年新高&#xff0c;美国3月未季调CPI年率录得3.5%&#xff0c;高于预期的3.4%水平&#xff0c;为2023年9月以来最高水平。美国CPI高于预期&#xff0c;现货黄金短线下挫16美元。日线当前的指标macd依旧属于金叉放量运行&#xff…

unipush+个推实现消息推送

1.注册个推平台的帐号个推&#xff0c;专业的数据智能服务商-为垂直领域提供数据智能解决方案 2.应用列表中选择新增应用/服务 3.填写下应用信息4.创建好应用后在manifest.json中的sdkConfigs配置上写入appid、appkey、appsecret "sdkConfigs" : {"ad" :…

tailwindcss+vue3+vite+preline项目搭建

最近原子化样式比较火&#xff0c;用了一下确实还不错&#xff0c;也确实是用一些标准的样式能够使网页看起来比较统一&#xff0c;而且能够极大的减轻起名字的压力&#xff0c;有利有弊&#xff0c;就不一一细说了。 之前开发都是习惯于使用vitevue3来开发的&#xff0c;此次搭…

ITK 重采样 resample

Itk 重新采样有二多种情况&#xff0c;这里说二种情况 1. 输入参数 &#xff0c;和输出相关数据&#xff0c;输出范围&#xff0c;spacing &#xff1b; typedef itk::Image< float, 3 > itkFloatImageType;typedef itk::ResampleImageFilter < itkFloatImageType, i…