首页 / 教程列表 / LINQ教程 / LINQ操作符之Where

LINQ操作符之Where

2021 更新于: 2021-11-04 读完约需 8 分钟

概述

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();

版权声明:本作品系原创,版权归码友网所有,如未经许可,禁止任何形式转载,违者必究。

本文永久链接码友网 » LINQ教程 » LINQ操作符之Where 分享:

发表评论

登录用户才能发表评论, 请 登 录 或者 注册