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

Operatore di filtraggio Where in LINQ

Gli operatori di filtraggio in LINQ filtrano la sequenza (insieme) in base a certi standard dati.

La tabella seguente elenca tutti gli operatori di filtraggio disponibili in LINQ.

Operatore di filtraggioDescrizione
Where

Restituisce i valori dalla raccolta in base alla funzione predicativa.

OfType

Restituisce i valori della raccolta in base al tipo specificato. Tuttavia, dipende da loro se possono essere convertiti nel tipo specificato.

Where

L'operatore Where (metodo di estensione LINQ) filtra l'insieme in base alle condizioni date e restituisce un nuovo insieme. È possibile specificare il criterio come espressione lambda o tipo di delegato Func.

WhereI metodi di estensione hanno due sovrcarichi. Entrambi i metodi accettano il tipo di parametro del delegato Func. Un sovrcarico richiede il parametro di input Func <TSource, bool>, il secondo metodo di sovrcarico richiede il parametro di input Func <TSource, int, bool>, dove int viene utilizzato come indice:

Sovraccarichi del metodo 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 clause nella sintassi della query

Esempio di query che utilizza l'operatore Where per filtrare gli studenti adolescenti da un insieme (sequenza) dati. Utilizza l'espressione lambda come funzione predicativa.

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

Nel esempio sopra, filteredResult includerà gli studenti seguenti dopo l'esecuzione della query.

John
Bill
Ron

Nel corpo dell'espressione lambda nell'esempio di query sopra, s.Age > 12 && s.Age < 20 come funzione predicativa per valutare ogni studente nella raccolta.Func<TSource, bool>

Inoltre, è possibile utilizzare il tipo di delega Func insieme a metodi anonimi, come funzione predicativa di seguito (il risultato è lo stesso):

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;

Puoi anche chiamare qualsiasi metodo che corrisponda al parametro Func utilizzando la sovraccarica del metodo 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;  
}

Metodo estensione where

Diversamente dalla sintassi di query, è necessario passare l'intera espressione lambda come funzione predicativa, non solo l'oggetto espressione nel corpo del metodo LINQ.

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

Come sopra menzionato,WhereL'estensione del metodo ha anche una versione secondaria, che include l'indice dell'elemento attuale nella collezione. Se necessario, è possibile utilizzare questo indice nella logica.

Esempio: utilizzo della clausola Where per filtrare gli elementi dispari della collezione, restituendo solo gli elementi pari. Ricorda che l'indice parte da 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) // 如果是偶数
                return true;
                
        return false;
    });
foreach (var std in filteredResult)
        Console.WriteLine(std.StudentName);

 

输出:
John
Bill
Ron

多个where子句

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

示例:查询语法C#中的多个where子句
var filteredResult = from s in studentList
                        where s.Age > 12                    
                        where s.Age < 20                    
                        select s;
示例:C#中的方法语法多个where子句
var filteredResult = studentList.Where(s => s.Age > 12).Where(s => s.Age < 20);

  要记住的要点

  1. Where 用于根据给定标准过滤集合。

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

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

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