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 && 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

위의 예제에서 filteredResult는 쿼리 실행 후 다음 학생을 포함할 것입니다.

John
Bill
Ron

위의 예제 쿼리에서 람다 표현식 본문은 s.Age > 12 && s.Age < 20 집합의 각 학생을 평가하는 판독 함수로 전달합니다.Func<TSource, bool>

또한, Func 타입 대리자와 익명 메서드를 함께 사용하여 다음과 같은 판독 함수로 전달할 수 있습니다. (출력은 동일합니다):

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;

Where() 메서드의 오버로드를 사용하여 Func 매개변수와 일치하는 모든 메서드를 호출할 수도 있습니다.

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

메서드 문법에서의 where 확장 메서드

쿼리 문법과 다르게, 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 )

위와 같이Where확장 메서드는 또한 집합에서 현재 요소의 인덱스를 포함한 두 번째 오버로드를 가지고 있습니다. 필요하다면 로직에서 해당 인덱스를 사용할 수 있습니다.

다음 예제에서 Where 절을 사용하여 집합에서 홀수 요소를 필터링하고, 단지 짝수 요소만 반환합니다. 인덱스는 0에서 시작합니다. 기억해 두세요.

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 절

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확장 메서드는 유효합니다.