dev/asp.net, c#

[c#] LINQ 컬렉션 표준 쿼리 메서드 1 - (정렬, 필터 : OrderBy, ThenBy, Reverse, OfType, Where )

코딩for 2022. 11. 11. 13:38
반응형

정렬과 필터링(조건) 에 대해 알아봅니다.

 

메서드

메서드 이름 설명 C# 쿼리 식 구문
OrderBy 오름차순으로 정렬 orderby
OrderByDescending 내림차순으로 정렬 orderby … descending
ThenBy 2차 정렬을 오름차순으로 수행 orderby …, …
ThenByDescending 2차 정렬을 내림차순으로 수행 orderby …, … descending
Reverse 요소의 순서를 거꾸로 변경  
OfType 지정된 형식으로 캐스트할 수 있는지   
Where 조건에 따라 값을 선택 where

 

정렬

정렬은 특정 기준으로 시퀀스들의 요소를 정렬합니다.

정렬 (OrderBy, OrderbyDecending, ThenBy, ThenbyDecending)

아래 예제는 시퀀스의 요소들을 1, 2차 정렬하는 방법을 보여준다

// 샘플 데이터
public class Student
{
    public int grade;       //학년
    public string name;     //이름
}

// 예제 데이터
List<Student> students = new List<Student>
{
    new Student{grade = 3, name = "Tom" },
    new Student{grade = 3, name = "Brian" },
    new Student{grade = 4, name = "Chris" },
    new Student{grade = 5, name = "James" }    
};
// 1차 정렬
var query = from student in students
            // grade 를 기준으로 내림차순 (descending 없으면 ascending이 기본 오름차순:사전순)
            orderby student.grade descending	
            select student;

var method = students.OrderByDescending(o => o.grade);
/*
위 두가지 방법은 동일하다.

== 결과==

5 James
4 Chris
3 Tom
3 Brain
*/


// N차 정렬
var query2 = from student in students
            // grade 내림차순 정렬 결과에 name으로 오름차순 정렬
            orderby student.grade descending, student.name	
            select student;

var method2 = students.OrderByDescending(student => student.grade).ThenBy(student=> student.name);
/*

==결과==

5 James
4 Chris
3 Brain
3 Tom
*/

 

 

순서바꾸기 (Reverse)

요소의 순서들을 바꾼다.

students.Reverse(); // 전체 요소의 순서를 바꿈
/*
결과
5 James
4 Chris      
3 Brian
3 Tom
*/


students.Reverse(0,3); // 0 번재 요소부터 3개를 바꿈.
/* 0번째 3개를 바꿈 (위 예제 에서  뒤바뀐 결과에서)
 결과
3 Brian
4 Chris      
5 James
3 Tom
*/

 

 

필터

조건에 맞는 목록만 결과집합에 포함하도록 한다.

필터 (OfType, Where)

조건에 맞는 요소만 선택한다.

List<Student> students = new List<Student>
{
    new Student{grade = 3, name = "Tom" },
    new Student{grade = 3, name = "Brian" },
    new Student{grade = 4, name = "Chris" },
    new Student{grade = 5, name = "James" }
};

// grade 가 3이면서  name이 B 로 시작하는 요소만 필터링
var query = from student in students
            where student.grade ==3 && student.name.IndexOf("B") >= 0
            select student;
            
var list = students.Where(w => w.grade == 3 && w.name.IndexOf("B")>=0);

foreach(var student in list)
{
    Console.WriteLine(student.grade +", " +student.name);
}
/*
 * 결과
 * 3, Brian
 */

 

 

 

참고 : https://learn.microsoft.com/ko-kr/dotnet/csharp/programming-guide/concepts/linq/sorting-data

 

반응형