C# Where关键字
1. 泛型约束(Generic Constraints)
在泛型类、接口或方法的定义中,where关键字用于指定类型参数的约束。这些约束可以确保类型参数具有某些特定的属性。例如它是一个类、实现了某个接口、是另一个类型的派生类、具有无参构造函数等。
1.1 泛型约束条件表
| 约束名称 | 详情 |
| T:struct | 类型参数必须是值类型,可指定除Nullable以外的任何值类型 |
| T: class | 类型参数必须是引用类型,包括任何类、接口、委托或数组类型 |
| T: new() | 类型参数必须具有无参构造函数(且访问保护等级为public),当与其他约束一同使用时,new()约束必须最后指定 |
| T: <基类名称> | 类型参数必须是指定的基类或派生自指定的基类 |
| T:<接口名称> | 类型参数必须是指定的接口或实现指定的接口,可指定多个接口约束,接口约束也可是泛型 |
1.2 各约束条件使用代码示例
1.2.1 T: struct
public class MyClass<T> where T : struct
{ // 在这里,T 必须是值类型 public void MyMethod(T item) { // ... }
}
1.2.2 T: class
public class MyClass<T> where T : class
{ // 在这里,T 必须是引用类型 public void MyMethod(T item) { // ... }
}
1.2.3 T: new()
public class MyClass<T> where T : new()
{ //在这里,T 必须具有无参构造函数//这个约束允许在泛型类内部创建类型参数类型的新实例public T CreateNewInstance() { return new T(); // 调用无参构造函数 }
}
1.2.4 T: <基类名称>
public class BaseClass
{ // 基类成员 public void BaseMethod() { // ... }
} public class DerivedClass1 : BaseClass
{ // DerivedClass1特有的成员
} public class MyClass<T> where T : BaseClass
{ //在这里,T 必须是指定的基类或派生自指定的基类// 泛型方法,接受T类型的参数 public void MyMethod(T item) { item.BaseMethod(); // 调用基类的方法 // 这里可以添加更多逻辑,针对T类型(即BaseClass或其派生类) }
}
1.2.5 T: <接口名称>
public interface IMyInterface
{ void MyInterfaceMethod();
} public class MyClass<T> where T : IMyInterface
{ //在这里,T 必须是指定的接口或实现指定的接口public void UseInterfaceMethod(T item) { item.MyInterfaceMethod(); // 调用接口方法 }
}
1.2.6 组合约束
1.2.6.1 class & 接口
public interface IMyInterface
{ void MyInterfaceMethod();
} public class MyClass<T> where T : class, IMyInterface
{ // 在这里,T 必须是引用类型并实现IMyInterface接口 public void UseInterfaceMethod(T item) { item.MyInterfaceMethod(); // 调用接口方法 }
}
1.2.6.1 基类 & 具有无参构造
public class MyBaseClass
{ public MyBaseClass() { } // 无参构造函数
} public class MyClass<T> where T : MyBaseClass, new()
{ // 在这里,T 必须是MyBaseClass或其派生类,并且有一个无参构造函数 public T CreateNewInstance() { return new T(); // 调用无参构造函数 }
}
2. LINQ查询中的条件过滤
LINQ(Language Integrated Query----语言集成查询)提供了一种强大的查询能力,允许你以声明式的方式对集合(如数组、列表等)进行查询和操作。where关键字在LINQ查询中用于指定过滤条件,以筛选出满足特定条件的元素。
示例:查询列表中的元素
假设你有一个Person类,包Name和Age属性
public class Person
{ public string Name { get; set; } public int Age { get; set; }
}
现在有Person对象的列表,如果你想要找出所有年龄大于30岁的人,你可以使用LINQ的where子句来实现:
public class MyClass
{ public List<Person> people = new List<Person> { new Person { Name = "张三", Age = 10 }, new Person { Name = "李四", Age = 20 }, new Person { Name = "王五", Age = 30 },new Person { Name = "赵六", Age = 40 },new Person { Name = "随便", Age = 50 },new Person { Name = "编个名", Age = 60 },new Person { Name = "V TheShow", Age = 200 },}; var olderPeople = from p in people where p.Age > 50select p; public void WriteFilterPeople(){foreach (var person in olderPeople) { Console.WriteLine(person.Name + " is " + person.Age + " years old."); } }//或者使用Lambda表达式var olderPeopleLambda = people.Where(p => p.Age > 50); public void WriteFilterPeopleLambda(){foreach (var person in olderPeopleLambda) { Console.WriteLine(person.Name + " is " + person.Age + " years old."); } }//上面的两种方式的输出均为/*编个名 is 60 years old.V TheShow is 200 years old.*/}
相关文章:
C# Where关键字
1. 泛型约束(Generic Constraints) 在泛型类、接口或方法的定义中,where关键字用于指定类型参数的约束。这些约束可以确保类型参数具有某些特定的属性。例如它是一个类、实现了某个接口、是另一个类型的派生类、具有无参构造函数等。 1.1 …...
《计算机组成原理》(第3版)第1章 计算机系统概论 复习笔记
第1章 计算机系统概论 一、计算机系统简介 (一)计算机的软硬件概念 1.计算机系统由“硬件”和“软件”两大部分组成 (1)所谓“硬件”,是指计算机的实体部分,如主机、外部设备等。 ࿰…...
达梦数据库的系统视图v$cachers
达梦数据库的系统视图v$cachers 达梦数据库的系统视图V$CACHERS的作用是显示缓存中的项信息,在 ini 参数 USE_PLN_POOL !0 时才统计。这个视图帮助数据库管理员监控和分析缓存的使用情况,优化数据库性能。通过查询V$CACHERS视图,可以获取缓存…...
电路元件基本知识详解
电路元件基本知识详解 在现代电子技术中,电路元件是构成各种电子电路的基本单元。它们各自具有不同的特性和功能,通过不同的连接方式实现多种多样的电路功能。本文将详细介绍几种常见的电路元件及其基本知识。 ### 一、电阻器 #### 1. 电阻器的基本概…...
从零开始写一个微信小程序
从零开始写一个微信小程序可以分为几个步骤。以下是一个详细的指南,帮助你从头到尾完成一个简单的微信小程序。 ### 一、准备工作 1. **注册微信小程序账号**: - 前往[微信公众平台](https://mp.weixin.qq.com/)注册一个小程序账号。 - 进行企业认证(个人账号需要申…...
07030405复杂可编程逻辑器件CPLD现场可编程阵列FPGA
复杂可编程逻辑器件CPLD&现场可编程阵列FPGA 7.3 复杂可编程逻辑器件CPLD7.3.1CPLD的结构 7.4现场可编程门阵列FPGA7.4.1FPGA实现逻辑功能的基本原理7.4.2FPGA结构简介1.可编程逻辑块2.I/O块3.可编程连线资源CPLD与FPGA的区别 7.5可编程逻辑器件开发过程简介编程条件 7.3 复…...
《雅思口语真经总纲1.0》话题实战训练笔记part1——5. Bus or taxi
《雅思口语真经总纲1.0》笔记——第四章:口语素材大全(part1、part2、part3回答准则及练习方法,不包括范例答案)★★★★★ 文章目录 Bus or taxiHou often do you take the bus?20240803答评价疑问 When was the first time you…...
《工程检索增强生成系统时的七个失败点》论文 AI 解读
周末使用 AI 速度了一篇 RAG 相关的论文,文中提到的【设计 RAG 系统时需要考虑的七个失败点】非常有价值,简单整理一下分享出来,大家如果感兴趣可以继续阅读原文。 论文名称:Seven Failure Points When Engineering a Retrieval A…...
每日一题——贪心算法
1005. K 次取反后最大化的数组和 - 力扣(LeetCode) 题解: 一开始有点理解错他的意思,以为是i是题目中会给出,所以一开始没有什么思路,然后当看了题解之后,就知道了原来i是自己订的,…...
Artix7系列FPGA实现SDI视频编解码+图像缩放+多路视频拼接,基于GTP高速接口,提供4套工程源码和技术支持
目录 1、前言工程概述免责声明 2、相关方案推荐本博已有的 SDI 编解码方案本博已有的FPGA图像缩放方案本博已有的已有的FPGA视频拼接叠加融合方案本方案的无缩放应用本方案在Xilinx--Kintex系列FPGA上的应用本方案在Xilinx--Zynq系列FPGA上的应用 3、详细设计方案设计原理框图S…...
HTTP 状态码详细介绍
超文本传输协议(Hypertext Transfer Protocol,HTTP)是一个简单的请求-响应协议,它通常运行在TCP之上。它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应。请求和响应消息的头以ASCII形式给出;而消息内…...
React前端面试每日一试 5.什么是受控组件和非受控组件?
在React中,受控组件和非受控组件是两种处理表单数据的方式。理解这两种方式对于管理和维护表单状态非常重要。 受控组件(Controlled Components) 受控组件是指那些表单数据完全由React组件的状态控制的组件。也就是说,表单元素的…...
代码随想录打卡第四十四天
代码随想录–动态规划部分 day 44 动态规划第11天 文章目录 代码随想录--动态规划部分一、力扣1143--最长公共子序列二、力扣1035--不相交的线三、力扣53--最大子数组和四、力扣392--判断子序列 一、力扣1143–最长公共子序列 代码随想录题目链接:代码随想录 给定…...
【JAVA】枚举类的使用:通过枚举类名称得到对应值进行输出
枚举类其实就是一个特殊的class。 /*** ClassName: CardType* Description:数字卡类型对应的文字卡类型*/ public enum CardType {NORMAL_CARD("金普卡"),BUSINESS_CARD("商务卡"),PRIVATE_CARD("黑金无限卡");private String cardName;CardTyp…...
20240731软考架构------软考6-10答案解析
每日打卡题6-10答案 6、【2012年真题】 难度:一般 若系统中的某子模块需要为其他模块提供访问不同数据库系统的功能,这些数据库系统提供的访问接口有一定的差异,但访问过程却都是相同的,例如,先连接数据库,…...
学习记录——day25 多线程编程 临界资源 临界区 竞态 线程的同步互斥机制(用于解决竟态)
目录 编辑 一、多进程与多线程对比 二、 临界资源 临界区 竞态 例1:临界资源 实现 输入输出 例2:对临界资源 进行 减减 例子3:临界资源抢占使用 三、线程的同步互斥机制(用于解决竟态) 3.1基本概念 3.2线…...
[RK3566]linux下使用upgrade_tool报错
linux下使用upgrade_tool报错Creating Comm Object failed! Rockusb>uf /home/zhuhongxi/RK3566_AOSP_SDK/rockdev/Image-rk3566_tspi/update.img Loading firmware... Support Type:RK3568 FW Ver:b.0.00 FW Time:2024-08-03 12:00:09 Loader ver:1.01 Loader Time:…...
系统架构师(每日一练13)
每日一练 答案与解析 1.应用系统构建中可以采用多种不同的技术,()可以将软件某种形式的描述转换为更高级的抽象表现形式,而利用这些获取的信息,()能够对现有系统进行修改或重构,从而产生系统的一个新版本。答案与解析 问题1 A.逆…...
Error: No module factory available for dependency type: CssDependency
本篇主要用来记录VUE打包的问题点,今天使用npm run build:prod 打包VUE出现如下问题: Error: No module factory available for dependency type: CssDependency 因为测试和预发布都挺正常的,正式环境竟然出问题,废话不多说&…...
【langchain学习】使用Langchain生成多视角查询
使用Langchain生成多视角查询 导入所需库: from langchain.prompts import ChatPromptTemplate from langchain_core.output_parsers import StrOutputParser from langchain_core.runnables import RunnablePassthrough from config import llm设置提示模板&#x…...
考研数学二必备:多元函数极值最值实战技巧(附拉格朗日乘数法详解)
考研数学二多元函数极值最值实战指南:从基础到高阶解题策略 多元函数极值与最值问题在考研数学二中占据重要地位,每年真题中至少出现1-2道大题。许多考生在面对这类问题时容易陷入"知道概念但不会解题"的困境。本文将打破传统教材的讲解顺序&a…...
三步掌握MidScene:AI浏览器自动化的零代码实战指南
三步掌握MidScene:AI浏览器自动化的零代码实战指南 【免费下载链接】midscene Let AI be your browser operator. 项目地址: https://gitcode.com/GitHub_Trending/mid/midscene MidScene是一款革命性的AI驱动浏览器自动化工具,让您能够通过自然语…...
STM32与W25Q64:构建自定义上位机字库烧录系统的实践指南
1. 为什么需要自定义字库烧录系统 在嵌入式显示项目中,中文字库的处理一直是个头疼的问题。我去年接手一个工业HMI项目,客户要求设备能显示繁简体中文、日文和部分特殊符号。最初尝试用SD卡加载字库,结果现场有30%的设备因为SD卡接触不良导致…...
LuatOS扩展库API——【airlbs 】airlbs 定位服务
LuatOS 是物联网终端开发的常用工具,为轻量级嵌入式 Lua 脚本运行框架兼实时系统,基于 Lua 5.3 深度优化,适配 4G-Cat.1、MCU 等物联网终端硬件。其以 Lua 脚本开发,采用协程多任务架构,配套完善开发资源,含…...
告别特征点!FAST-LIVO2的‘直接法’融合:如何用原始点云和图像块实现更快的SLAM?
FAST-LIVO2:直接法SLAM的革命性突破与工程实践指南 1. 直接法SLAM的技术演进与核心价值 当波士顿动力的Atlas机器人完成后空翻动作时,其核心定位系统正面临着与人类体操运动员相似的挑战——如何在高速运动中维持对环境的精确感知。这正是FAST-LIVO2这类…...
别再只用折线图了!Excel散点图制作双轴图的3个隐藏技巧与常见误区
Excel双轴图进阶指南:为什么散点图比折线图更适合专业数据可视化 在数据可视化领域,Excel的双轴图表一直是展示多维度数据的利器。但很多用户在使用过程中都会遇到这样的困扰:明明按照教程步骤操作,最终呈现的图表却总是出现数据点…...
RePKG:解锁Wallpaper Engine壁纸资源的三大核心功能
RePKG:解锁Wallpaper Engine壁纸资源的三大核心功能 【免费下载链接】repkg Wallpaper engine PKG extractor/TEX to image converter 项目地址: https://gitcode.com/gh_mirrors/re/repkg 你是否曾经看着Wallpaper Engine里精美的动态壁纸,想要提…...
150万规模!深势开源科学图像界ImageNet,AI终于能看懂论文图表了
150 万图文对、500 万子图,全面覆盖 300 科学子学科。深势开源 OmniScience,让 AI 真正读懂科研文献图表。跨越“盲区”:让AI真正读懂科学影像在科学研究日益数字化的今天,大模型已经能够高效处理书籍与文献中的文本信息。不过&am…...
ai辅助开发:基于快马平台为trea国际版添加汇率数据智能分析功能
最近在开发Trea国际版应用时,遇到了一个需求:如何让用户更直观地理解汇率波动趋势,并通过自然语言交互获得分析结果。这个功能看似复杂,但借助InsCode(快马)平台的AI辅助开发能力,整个过程变得异常简单。下面分享我的实…...
DeEAR语音情感识别入门必看:为何唤醒度比‘情绪极性’更能反映真实交互状态?
DeEAR语音情感识别入门必看:为何唤醒度比‘情绪极性’更能反映真实交互状态? 如果你用过一些语音助手,或者跟客服机器人打过交道,可能会发现一个有趣的现象:有时候系统能识别出你“生气”了,但它的回应方式…...
