C# Where关键字

server/2024/10/20 16:09:09/

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.*/}

   


http://www.ppmy.cn/server/95851.html

相关文章

软件测试需要具备的基础知识【功能测试】---前端知识(二)

​ ​ 您好&#xff0c;我是程序员小羊&#xff01; 前言 为了更好的学习软件测试的相关技能&#xff0c;需要具备一定的基础知识。需要学习的基础知识包括&#xff1a; 1、计算机基础 2、前端知识 3、后端知识 4、软件测试理论 后期分四篇文章进行编写&#xff0c;这是第二篇 …

flex的css总结,

1、App.vue的<style>中全局阴影 <style> /* 引入flex布局样式 */ import "./styles/flex.css"; </style> 2、编写flex.css文件 charset "UTF-8";.flex {display: -webkit-flex;display: flex; }/*即项目的排列方向*/ .flex-direction…

Vcpkg安装指定版本包或自定义安装包

在使用 vcpkg 安装特定版本的包或自定义包时&#xff0c;你可以按照以下步骤进行操作&#xff1a; 安装特定版本的包 列出可用的版本&#xff1a; 使用以下命令列出特定包的所有可用版本&#xff1a; vcpkg search <package-name>安装特定版本&#xff1a; 使用 vcpkg …

谷粒商城实战笔记-125-全文检索-ElasticSearch-整合-SpringBoot整合high-level-client

文章目录 一&#xff0c;技术选型1. 通过 TCP 连接&#xff08;9300 端口&#xff09;2. 通过 HTTP 连接&#xff08;9200 端口&#xff09;3.最终选择 二&#xff0c;SpringBoot整合Elasticsearch-Rest-High-Level-Client1&#xff0c;新增模块gulimall-search1&#xff0c;添…

Studying-代码随想录训练营day57| prim算法精讲、kruskal算法精讲

第57天&#xff0c;图论07&#xff0c;两个最小生成树算法的讲解&#x1f4aa;(ง •_•)ง&#x1f4aa;&#xff0c;编程语言&#xff1a;C 目录 题目&#xff1a;53. 寻宝&#xff08;第七期模拟笔试&#xff09; (kamacoder.com) prim算法精讲 拓展 总结&#xff1a; …

贝叶斯学习方法:几种方法介绍

目录 1 拉普拉斯还原-轻松贝叶斯深度学习2 具有归一化流的变分推理3 基于条件归一化流的多元概率时间序列预测 1 拉普拉斯还原-轻松贝叶斯深度学习 深度学习的贝叶斯公式已被证明具有令人信服的理论性质&#xff0c;并提供实用的功能优势&#xff0c;例如改进预测不确定性量化…

搜索引擎设计:如何避免大海捞针般的信息搜索

搜索引擎设计&#xff1a;如何避免大海捞针般的信息搜索 随着互联网的发展&#xff0c;信息的数量呈爆炸式增长。如何在海量信息中快速、准确地找到所需信息&#xff0c;成为了搜索引擎设计中的核心问题。本文将详细探讨搜索引擎的设计原理和技术&#xff0c;从信息获取、索引…

机器学习第五十周周报 CGNN

文章目录 week50 CGNN摘要Abstract0. 概述1. 题目2. Abstract3. 网络结构3.1 状态更新网络3.2 method 4. 文献解读4.1 Introduction4.2 创新点4.3 实验过程 5. 结论6.相关代码CompositeLGNNCompositeGNNcomposite-graph-class小结参考文献 week50 CGNN 摘要 本周阅读了题为Co…