猿教程 Logo

Linq-where

阿里云服务器,每月低至7.8元,项目演示即建站必备,比腾讯云更便宜,并且不需学生认证,从此链接购买有效:去购买

LINQ中的过滤操作符根据一些给定的标准过滤序列(集合)。

下表列出了LINQ中可用的所有过滤操作符。

过滤操作描述
Where基于谓词函数返回集合中的值
OfType根据指定的类型返回集合中的值。 然而,它将取决于他们能够投射到指定的类型。

Where

Where运算符(Linq扩展方法)根据给定的条件表达式过滤集合,并返回一个新集合。 可以将条件指定为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);

查询语法中的where子句:

以下查询示例使用Where运算符过滤来自给定集合(序列)的青少年的学生。 它使用lambda表达式作为谓词函数。

相关实例:

IList<Student> studentList = new List<Student>() { 
        new Student() { StudentID = 1, StudentName = "John", Age = 13} ,
        new Student() { StudentID = 2, StudentName = "Moin",  Age = 21 } ,
        new Student() { StudentID = 3, StudentName = "Bill",  Age = 18 } ,
        new Student() { StudentID = 4, StudentName = "Ram" , Age = 20} ,
        new Student() { StudentID = 5, StudentName = "Ron" , Age = 15 } 
    };


var filteredResult = from s in studentList
                    where s.Age > 12 && s.Age < 20
                    select s.StudentName;

相关实例:

Dim studentList = New List(Of Student) From {
        New Student() With {.StudentID = 1, .StudentName = "John", .Age = 13},
        New Student() With {.StudentID = 2, .StudentName = "Moin", .Age = 21},
        New Student() With {.StudentID = 3, .StudentName = "Bill", .Age = 18},
        New Student() With {.StudentID = 4, .StudentName = "Ram", .Age = 20},
        New Student() With {.StudentID = 5, .StudentName = "Ron", .Age = 15}
    }

Dim filteredResult = From s In studentList
                     Where s.Age > 12 And s.Age < 20
                     Select s.StudentName

在上面的示例中,filteredResult将在查询执行后包括以下学生。

运行结果:

John Bill Ron

在上面的示例查询中,lambda表达式主体s.Age> 12 && s.Age <20作为谓词函数Func <TSource,bool>传递,用于评估集合中的每个学生。

或者,也可以使用带有匿名方法的Func类型委托作为如下的谓词函数传递(输出将是相同的):

相关实例:

Func<Student,bool> isTeenAger = delegate(Student s) { 
                                    return s.Age > 12 && s.Age < 20; 
                                };

var filteredResult = from s in studentList
                     where isTeenAger(s)
                     select s;

您还可以调用与Func参数匹配的任何方法与Where()方法重载之一。

相关实例:

public static void Main()
{
    var filteredResult = from s in studentList
                         where isTeenAger(s)
                         select s;
}

public static bool IsTeenAger(Student stud)
{
    return stud.Age > 12 && stud.Age < 20;  
}

where方法语法:

与查询语法不同,您需要将整个lambda表达式作为谓词函数,而不仅仅是LINQ方法语法中的body表达式。

相关实例:

var filteredResult = studentList.Where(s => s.Age > 12 && s.Age < 20);

相关实例:

Dim filteredResult = studentList.Where(Function(s) s.Age > 12 And s.Age < 20 )

如上所述,Where扩展方法还具有包括集合中当前元素的索引的第二重载。 如果需要,您可以在逻辑中使用该索引。

以下示例使用Where子句来过滤集合中的奇数元素,并仅返回偶数元素。 请记住,索引从零开始。

相关实例:

IList<Student> studentList = new List<Student>() { 
        new Student() { StudentID = 1, StudentName = "John", Age = 18 } ,
        new Student() { StudentID = 2, StudentName = "Steve",  Age = 15 } ,
        new Student() { StudentID = 3, StudentName = "Bill",  Age = 25 } ,
        new Student() { StudentID = 4, StudentName = "Ram" , Age = 20 } ,
        new Student() { StudentID = 5, StudentName = "Ron" , Age = 19 } 
    };

var filteredResult = studentList.Where((s, i) => { 
            if(i % 2 ==  0) // if it is even element
                return true;
                
        return false;
    });

foreach (var std in filteredResult)
        Console.WriteLine(std.StudentName);

运行结果:

John Bill Ron

多where子句:

您可以在单个LINQ查询中多次调用Where()扩展方法。

相关实例:

var filteredResult = from s in studentList
                    where s.Age > 12
                    where s.Age < 20
                    select s;

相关实例:

var filteredResult = studentList.Where(s => s.Age > 12).Where(s => s.Age < 20);
要点
  1. 根据给定的标准过滤集合的位置。 

  2. 其中扩展方法有两个重载方法。 使用第二个重载方法可以知道集合中当前元素的索引。 

  3. 方法语法需要Where扩展方法中的整个lambda表达式,而Query语法只需要表达式主体。 

  4. 多个where扩展方法在单个LINQ查询中有效。

在下一部分中了解另一个过滤运算符 - OfType。

阿里云服务器,每月低至7.8元,项目演示即建站必备,比腾讯云更便宜,并且不需学生认证,从此链接购买有效: 去购买


版权声明:本站所有教程均为本站原创或翻译,转载请注明出处,请尊重他人劳动果实。请记住本站地址:www.yuanjiaocheng.net (猿教程) 作者:卿文刚
本文标题: C#环境
本文地址:http://www.yuanjiaocheng.net/Linq/linq-filtering-operators-where.html