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 Et 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 Et s.Age < 20 Select s.StudentName
Dans l'exemple précédent, filteredResult contiendra les étudiants suivants après l'exécution de la requête.
John Bill Ron
Dans l'exemple de requête précédent, le corps de l'expression lambda, s.Age > 12 Et s.Age < 20 comme fonction prédicative pour évaluer chaque étudiant de la collection.Func<TSource, bool>
De plus, vous pouvez utiliser le delegate de type Func avec une méthode anonyme pour passer une fonction prédicative comme suit (le résultat est le même) :
Func<Student,bool> isTeenAger = delegate(Student s) { return s.Age > 12 Et s.Age < 20; }; var filteredResult = from s in studentList where isTeenAger(s) select s;
Vous pouvez également appeler n'importe quelle méthode correspondant au paramètre Func en utilisant la surcharge de la méthode 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 Et stud.Age < 20; }
Contrairement à la syntaxe de requête, vous devez passer toute l'expression lambda en tant que fonction prédicative, et non simplement le corps de l'expression dans la syntaxe de méthode LINQ.
var filteredResult = studentList.Where(s => s.Age > 12 Et s.Age < 20);
Dim filteredResult = studentList.Where(Function(s) s.Age > 12 Et s.Age < 20 )
Comme mentionné précédemment,WhereL'extension de méthode a également une deuxième surcharge, qui inclut l'index de l'élément actuel de la collection. Vous pouvez utiliser cet index dans la logique si nécessaire.
Dans les exemples suivants, la clause Where est utilisée pour filtrer les éléments impairs de la collection, ne retournant que les éléments pairs. N'oubliez pas que l'index commence à zéro.
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) // Si c'est pair return true; return false; }); foreach (var std in filteredResult) Console.WriteLine(std.StudentName);
John Bill Ron
Vous pouvez appeler plusieurs fois l'extension Where() dans une requête LINQ unique.
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 Utilisé pour filtrer le jeu en fonction des critères donnés.
Parmi les méthodes d'extension, il y a deux surcharges. L'utilisation de la deuxième surcharge permet de connaître l'index de l'élément actuel du jeu.
La grammaire de méthode nécessite l'expression lambda entière de l'extension Where, tandis que la grammaire de requête n'en a besoin que du corps de l'expression.
Dans une requête LINQ unique, plusieursWhereMéthodes d'extension valides.