概述
LINQ中的过滤操作符根据一些给定的条件对序列(集合)进行过滤。
下表列出了LINQ中可用的所有过滤操作符。
操作符 | 描述 |
---|---|
Where | 根据谓词函数从集合返回值。 |
OfType | 根据指定的类型过滤IEnumerable中的元素。 |
Where
Where
操作符(Linq扩展方法)基于给定的条件表达式过滤集合,并返回一个新的集合。Where
的谓词可以指定为Lambda表达式或Func
委托类型。
Where
扩展方法有以下两个重载,两个重载方法都接受Func
委托类型参数。一个重载需要Func<TSource,bool>输入参数,第二个重载方法需要Func<TSource, int, bool>输入参数,其中int
表示索引:
public static IEnumerable<TSource> Where<TSource>(
this IEnumerable<TSource> source,
Func<TSource, bool> predicate
)
public static IEnumerable<TSource> Where<TSource>(
this IEnumerable<TSource> source,
Func<TSource, int,
bool> predicate
)
LINQ查询语法中的Where谓词
以下是从一个订单集合中筛选订单来源(Source)为”线上”并且订单金额大于2000的所有订单子集合,使用LINQ查询语法和方法语法的实现方式分别为:
static void Main()
{
var orders = FakeData.Orders;
// 1.查询语法
var result = from o in orders
where o.Source == "线上" && o.Price > 2000
select o;
// 2.方法语法
//var result = orders
// .Where(o => o.Source == "线上" && o.Price > 2000)
// .ToList();
foreach (var order in result)
{
Console.WriteLine($"{order.Id},{order.Customer}");
}
Console.ReadKey();
}
输出结果为:
1,Rector
2,James
4,Steven
6,Rector
在上面的示例查询中,Lambda表达式体o.Source == "线上" && o.Price > 2000
作为谓词函数Func<TSource, bool>
传递,该函数计算集合中的每个学生。
或者,你也可以使用带有匿名方法的Func
类型委托作为谓词函数传递,如下所示:
Func<Order, bool> highQuality = delegate (Order o) { return o.Source == "线上" && o.Price > 2000; };
// 1.查询语法
var result = from o in orders
where highQuality(o)
select o;
你还可以使用Where()
方法重载之一—调用与Func
参数匹配的任何方法,如下:
static void Main()
{
var orders = FakeData.Orders;
// 1.查询语法
var result = from o in orders
where HighQuality(o)
select o;
}
public static bool HighQuality(Order order)
{
return order.Source == "线上" && order.Price > 2000;
}
Where()
扩展方法还要一个带索引参数的重载方法,使用示例如下:
var result = orders.Where((o, index) => o.Source == "线上" && o.Price > 2000 && index % 2 == 0);
以上Lambda表达式中使用了Where()
扩展方法带索引参数(index)的重载方法,并在查询中添加了筛选索引下标能被2整除的条件。
多个Where条件
在一个LINQ查询中,可以多次调用Where()
扩展方法,示例如下:
// 1.查询语法
var result = from o in orders
where o.Source == "线上"
where o.Price > 2000
select o;
// 2.方法语法
//var result = orders
// .Where(o => o.Source == "线上")
// .Where(o => o.Price > 2000)
// .ToList();
发表评论
登录用户才能发表评论, 请 登 录 或者 注册