English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
LINQ中的过滤运算符根据某些给定的标准过滤序列(集合)。
下表列出了LINQ中所有可用的过滤运算符。
筛选运算符 | 描述 |
---|---|
Where | 根据谓词函数从集合中返回值。 |
OfType | 根据指定类型返回集合中的值。 然而,它取决于它们是否能够向指定类型转换。 |
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运算符从给定的集合(序列)中筛选出青少年的学生。它使用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 Y 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 Y s.Age < 20 Select s.StudentName
En el ejemplo anterior, filteredResult incluirá los siguientes estudiantes después de la ejecución de la consulta.
John Bill Ron
En la consulta de ejemplo anterior, el cuerpo de la expresión lambda s.Age > 12 Y s.Age < 20 como función predicativa para evaluar cada estudiante en la colección.Func<TSource, bool>
Además, también puede usar el delegado de tipo Func junto con métodos anónimos para pasar como función predicativa (el resultado es el mismo):
Func<Student,bool> isTeenAger = delegate(Student s) { Devolver s.Age > 12 Y s.Age < 20; }; var filteredResult = from s in studentList where isTeenAger(s) select s;
También puede invocar cualquier método que coincida con el parámetro de tipo Func mediante la sobrecarga del método Where().
public static void Main() { var filteredResult = from s in studentList where isTeenAger(s) select s; } public static bool IsTeenAger(Student stud) { Devolver stud.Age > 12 Y stud.Age < 20; }
Diferente a la sintaxis de consulta, debe pasar toda la expresión lambda como función predicativa, no solo el cuerpo de la expresión en la sintaxis de método de LINQ.
var filteredResult = studentList.Where(s => s.Age > 12 Y s.Age < 20);
Dim filteredResult = studentList.Where(Function(s) s.Age > 12 Y s.Age < 20 )
Como se mencionó anteriormente,WhereEl método de extensión también tiene una sobrecarga adicional que incluye el índice del elemento actual en la colección. Si es necesario, puede usar este índice en la lógica.
A continuación, se muestra un ejemplo que filtra los elementos impares de la colección utilizando la cláusula Where, devolviendo solo los elementos pares. Recuerde, el índice comienza en cero.
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) // 如果是偶数 return true; return false; }); foreach (var std in filteredResult) Console.WriteLine(std.StudentName);
John Bill Ron
您可以在单个 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);
Where 用于根据给定标准过滤集合。
其中扩展方法有两种重载方法。使用第二个重载方法可以知道集合中当前元素的索引。
方法语法需要Where扩展方法中的整个lambda表达式,而查询语法只需要表达式体。
在单个LINQ查询中,多个Where扩展方法有效。