English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
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 filtraggio | Descrizione |
---|---|
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. |
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:
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);
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; }
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
您可以在单个 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扩展方法有效。