English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

LINQ 过滤运算符 Where

LINQ中的过滤运算符根据某些给定的标准过滤序列(集合)。

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

筛选运算符描述
Where

根据谓词函数从集合中返回值。

OfType

根据指定类型返回集合中的值。 然而,它取决于它们是否能够向指定类型转换。

Where

Where运算符(Linq扩展方法)基于给定的条件表达式过滤集合并返回新集合。可以将标准指定为lambda表达式或Func委托类型。

Where扩展方法有以下两个重载。两种重载方法都接受Func委托类型参数。一个重载需要Func <TSource,bool>输入参数,第二个重载方法需要Func <TSource,int,bool>输入参数,其中int用于索引:

Where方法重载:
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 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;  
}

Méthode d'extension where

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

 

Sortie :
John
Bill
Ron

Multiple Where clauses

Vous pouvez appeler plusieurs fois l'extension Where() dans une requête LINQ unique.

Exemple : syntaxe de requête multiple avec Where dans C#
var filteredResult = from s in studentList
                        where s.Age > 12                    
                        where s.Age < 20                    
                        select s;
Exemple : syntaxe de méthode multiple avec Where dans C#
var filteredResult = studentList.Where(s => s.Age > 12).Where(s => s.Age < 20);

  Points à retenir

  1. Where Utilisé pour filtrer le jeu en fonction des critères donnés.

  2. 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.

  3. 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.

  4. Dans une requête LINQ unique, plusieursWhereMéthodes d'extension valides.