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 E 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 E s.Age < 20 Select s.StudentName
No exemplo acima, filteredResult incluirá os seguintes alunos após a execução da consulta.
John Bill Ron
No corpo da expressão lambda da consulta acima, s.Age > 12 E s.Age < 20 como função predicativa para avaliar cada aluno na coleção.Func<TSource, bool>
Além disso, você pode usar delegados do tipo Func juntamente com métodos anônimos, como no seguinte predicativo (o resultado é o mesmo):
Func<Student,bool> isTeenAger = delegate(Student s) { return s.Age > 12 E s.Age < 20; }; var filteredResult = from s in studentList where isTeenAger(s) select s;
Você também pode chamar qualquer método que coincida com o parâmetro Func pelo overload do método 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 E stud.Age < 20; }
Diferente da sintaxe de consulta, você precisa passar toda a expressão lambda como função predicativa, e não apenas o corpo da expressão na sintaxe do método LINQ.
var filteredResult = studentList.Where(s => s.Age > 12 E s.Age < 20);
Dim filteredResult = studentList.Where(Function(s) s.Age > 12 E s.Age < 20 )
Como mencionado acima,WhereA extensão do método também tem uma sobre carga adicional, que inclui o índice do elemento atual na coleção. Você pode usar esse índice na lógica, se necessário.
Os seguintes exemplos usam a cláusula Where para filtrar elementos ímpares da coleção, retornando apenas elementos pares. Lembre-se de que o índice começa no zero.
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) // Se for par return true; return false; }); foreach (var std in filteredResult) Console.WriteLine(std.StudentName);
John Bill Ron
Você pode chamar várias vezes o método de extensão Where() em uma consulta LINQ única.
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 Usado para filtrar a coleção com base em um padrão dado.
Entre eles, há dois métodos sobrecarregados do método de extensão. Usando o segundo método sobrecarregado, você pode saber o índice do elemento atual da coleção.
A sintaxe de método requer a expressão lambda completa no método de extensão Where, enquanto a sintaxe de consulta só precisa do corpo da expressão.
Em uma consulta LINQ única, múltiplosWhereMétodos de Extensão Válidos.