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…...
ASPCMS 漏洞详细教程
一.后台修改配置文件拿shell 登录后台 如下操作 保存并抓包 将slideTextStatus的值修改为1%25><%25Eval(Request(chr(65)))25><%25 放包(连接密码是a) 然后用工具连接 成功连接...
二维码生成原理及解码原理
☝☝☝二维码配图 二维码 二维码(Quick Response Code,简称QR码)是一种广泛使用的二维条形码技术,由日本公司Denso Wave在1994年开发。二维码能有效地存储和传递信息,广泛应用于商品追溯、支付、广告等多个领域。二维…...
云计算实训20——mysql数据库安装及应用(增、删、改、查)
一、mysql安装基本步骤 1.下载安装包 wget https://downloads.mysql.com/archives/get/p/23/file/mysql-8.0.33-1.el7.x86_64.rpm-bundle.tar 2.解压 tar -xf mysql-8.0.33-1.el7.x86_64.rpm-bundle.tar 3.卸载mariadb yum -y remove mariadb 查看解压后的包 [rootmysq…...
24年电赛——自动行驶小车(H题)基于 CCS Theia -陀螺仪 JY60 代码移植到 MSPM0G3507(附代码)
前言 只要搞懂 M0 的代码结构和 CCS 的图形化配置方法,代码移植就会变的很简单。因为本次电赛的需要,正好陀螺仪部分代码的移植是我完成的。(末尾附全部代码) 一、JY60 陀螺仪 JY60特点 1.模块集成高精度的陀螺仪、加速度计&…...
数组的增删查查改
1、增 1.Cpp #include <iostream> using namespace std; #include "add.h"int main() {//初始化数组int arr[5];//前四个元素为1,2,3,4for (int i 0; i < 4; i){arr[i] i1;}//数组第5个赋值为100arr[4] 100;for (int…...
设计模式——动态代理
设计模式——动态代理 动态代理的基本概念动态代理的实现步骤总结 在Java中,动态代理是一种强大的机制,它允许在运行时创建一个代理对象,这个代理对象可以代表另一个实际对象,它允许你在不直接操作原始对象的情况下,通…...
vue(element-ui组件) 的this.$notify的具体使用
getNotify() {this.noClose();let message "";message this.itemData.map((ele) > {const text "任务" ele.title "新增" ele.num "条言论";return this.$createElement("el-tooltip",{props: {content: text,pla…...
c++ - 模拟实现set、map
文章目录 前言一、set模拟实现二、map模拟实现 前言 在C标准库中,std::set 和 std::map都是非常常用的容器,它们提供了基于键值对的存储和快速查找能力。然而,关于它们的底层实现,C标准并没有强制规定具体的数据结构,只…...
计算机网络-PIM协议基础概念
一、PIM基础概念 组播网络回顾: 组播网络从网络结构上大体可以分为三个部分: 源端网络:将组播源产生的组播数据发送至组播网络。 组播转发网络:形成无环的组播转发路径,该转发路径也被称为组播分发树(Multi…...
优化PyCharm:让IDE响应速度飞起来
优化PyCharm:让IDE响应速度飞起来 PyCharm,作为一款功能强大的集成开发环境(IDE),在提供丰富功能的同时,有时也会出现响应慢的问题。这不仅影响开发效率,还可能打击开发者的积极性。本文将详细…...
工业设计是干啥的/seo搜索引擎优化入门
在相当长的一段时间内,FPGA、ASIC、DSP三者不同的技术特征造就了它们不同的应用领域,DSP在数字信号方面是绝对的霸主,ASIC是专业定制领域的牛人,而FPGA由于其价格高、功耗大,主要用于ASIC前端验证和一些高端领域&#…...
wordpress好看的底部/引流获客工具
目录 1、登录 2、添加 3、删除 4、查询 1、登录 (1)用户名和密码都符合要求(格式上的要求) (2)用户名和密码都不符合要求(格式上的要求) (3)用户名符合…...
山西太原做企业网站建设的公司/怎么学seo基础
本文转自 作者:闪客sun 公众号:低并发编程 本来想写内核如何接收一个网络包这个过程,但发现把整个过程捋顺了,还是很难的。 推导整个过程的起点是中断,包括硬中断和软中断。 而这个过程要是讲清楚吧,感觉在…...
wordpress流动图片/百度搜索指数和资讯指数
发布时间:2018-03-25创造与魔法游戏中有着监狱这一设定,不少小伙伴不知道自己做错了什么就迷迷糊糊进了监狱,那么,进监狱了怎么办呢?下面就让牛游戏小编来为大家介绍一下创造与魔法进监狱的解决办法吧! 有水友问小编,我在PVE模式里杀人拆别人房子会 ...标签&#x…...
网站建设要考/长沙关键词自然排名
strings包中的函数用法 参考链接http://studygolang.com/articles/88 1、strings.replace() 函数原型 func Replace(str1, old, str2, n int) string //old是str1中的字符串,用str2替换str1中的old,一共替换n个。如果n<0,则全部替换 fm…...
前端优化网站/关键词生成器 在线
介绍: 使用教程: 1、首先吧插件下载到彩虹易支付程序的根目录,然后解压即完成安装! 2、安装后配置哆咪付商户信息! 后台→系统设置→企业付款配置→哆咪付商户ID / 哆咪付商户秘钥 / 哆咪付交易安全码 配置完即可正常…...