C#中Enumerable.Where的功能及Lambda表达式x=>x的使用场景咨询
Enumerable.Where 的核心作用
简单来说,Enumerable.Where 是LINQ(语言集成查询)里最常用的过滤工具——它能帮你从一个集合(比如List、数组,或者任何实现了IEnumerable<T>的类型)里,挑出所有满足你指定条件的元素,返回一个新的可枚举集合,而且完全不会修改原集合的内容。它采用延迟执行的方式,也就是直到你真正遍历结果(比如调用ToList()、foreach循环)的时候,才会实际执行筛选逻辑。
代码示例逐行解析
咱们来拆解你给出的两段代码:
第一段代码:账户筛选
var selected = APIData.Accounts.Where(x => x["Billing Day A"].ToString() == bA && x["Billing Day B"].ToString() == bB);
这段代码的功能很明确:
- 从
APIData.Accounts这个集合里,筛选出同时满足两个条件的账户:- 账户的
"Billing Day A"字段(看起来像是用索引器访问的,比如DataRow或者动态类型的属性)转成字符串后,和变量bA的值完全相等; - 账户的
"Billing Day B"字段转成字符串后,和变量bB的值完全相等。
- 账户的
- 注意这里的
selected是一个IEnumerable<T>类型的对象,还没有实际执行筛选——只有当你后续遍历它的时候,筛选逻辑才会跑起来。
第二段代码:产品权限筛选
var selected = AllowedProducts.ProductA.Where(x => x.Item1 == intType || x.Item1 == DataPrep.InterestType.NONE.ToString()).ToList();
这段代码和第一段的核心逻辑类似,但有几个细节差异:
- 它从
AllowedProducts.ProductA集合里,筛选出满足以下任一条件的元素:- 元素的
Item1属性(看起来像是元组Tuple<T1, T2,...>的第一个元素,或者自定义类型的属性)等于变量intType; - 元素的
Item1属性等于枚举DataPrep.InterestType.NONE转成的字符串。
- 元素的
- 最后调用了
ToList(),这会立即执行筛选逻辑,把结果转换成一个List<T>集合,而不是延迟执行的可枚举对象。
Lambda 表达式
x => x 的适用场景 x => x 是最简单的Lambda表达式之一,它表示**“接收一个参数x,然后直接返回x本身”**,也就是所谓的“恒等函数”。它的适用场景主要有这些:
- 集合转换/传递:当你需要把一个集合转换成另一种类型,但不需要修改元素本身的时候,比如在某些高阶函数场景下,传递
x => x来保持元素原样; - 去重/分组的键选择器:比如用
DistinctBy(x => x)来按元素本身的内容去重,或者GroupBy(x => x)把相同的元素分到一组; - 委托传递:当某个方法需要一个
Func<T, T>类型的委托(输入输出类型相同的函数),而你需要的就是“原样返回”逻辑时,直接传x => x就很方便,比如一些缓存、包装类的方法; - 调试/测试:在快速验证集合内容的时候,用
Select(x => x)可以快速生成一个和原集合一致的可枚举对象,方便调试查看。
内容的提问来源于stack exchange,提问作者Priyanka Ray
相关产品推荐
相关产品推荐

