본문 바로가기

C#/기본적인 팁

배열과 List<T>의 다양한 처리 (조건을 만족하는 요소 구하기, 중복 제거, 순서대로 나열, 컬렉션 연결)

배열과 List<T> 둘 다 IEnumerable<T> 인터페이스를 가지고 있다는 공통점이 있다.

LINQ를 이용하면 배열도 List<T>도 동일한 코드로 다양한 처리를 수행할 수 있다.

LINQ를 사용한 코드와 LINQ를 사용하지 않는 코드를 모두 사용할 수 있지만 대부분의 경우에 LINQ를 사용해서 코드를 작성하는 것이 바람직하다.
코드양을 줄일 수 있고 무엇을 하는가 코드안에서 파악하기가 쉽기 때문이다.

과거에 작성된 코드를 유지보수해야하는 상황이 생길 수 있기 때문에 LINQ를 사용하지 않은 코드도 이해해야할 필요가 있다.

 

[LINQ]

Average 메서드 : 평균값
Sum 메서드 : 합계
Min 메서드 : 최소값
Max 메서드 : 최대값
Count 메서드 : 조건에 일치하는 요소의 개수를 셀 수 있다.

 

Any메서드 : 조건에 일치하는 요소가 존재하는지 여부를 조사
All 메서드 : 컬렉션 안에 있는 모든 요소가 조건을 만족하는지 조사

  • All 메서드를 사용할 때 주의해야 할 때는 시퀀스가 비어있는 경우이다.
    이처럼 비어 있는 경우에는 항상 true가 반환된다.

SequenceEqual 메서드 : 두 컬렉션이 같은지 조사
FirstOrDefault 메서드 : 조건에 일치하는 첫 요소를 구한다.
LastOrDefault 메서드 : 조건에 일치하는 마지막 요소를 구한다.

 

[LINQ가 아닌 배열, List<T> 내부 메서드]

FindIndex, FindLastIndex 메서드 : 조건에 일치하는 첫/마지막 인덱스를 구한다.
FindIndex나 FindLastIndex 메서드를 사용할 수 있는 것은 처리 대상이 되는 컬렉션이 배열이나 List<T>일 때뿐

 

 

조건을 만족하는 n개의 요소를 구한다


Where 메서드와 Take 메서드로 구현

var results = numbers.Where(n => n > 0).Take(5);

Take 메서드는 요소가 지정한 개수만큼 없어도 오류를 발생시키지 않고 구할 수 있는 만큼의 요소를 구한다.


조건을 만족하는 동안에만 요소를 구한다


TakeWhile 메서드를 사용하면 지정한 조건을 만족하는 동안에만 요소를 구할 수 있다. 조건을 만족하지 않는 요소가 발견된 시점에서 열거하는 일을 끝낸다.

var selected = books.TakeWhile(x => x.Price < 6000);

books 컬렉션을 첫 요소부터 조사해서 서적의 가격이 6,000원 미만인 동안에만 서적 객체를 구한다. 가격이 6000원 이상인 서적이 발견된 시점에서 열거하는 작업을 끝낸다.


조건을 만족하는 동안에는 요소를 건너뛴다


SkipWhile 메서드는 지정한 조건을 만족하는 동안에는 요소를 건너뛰는 메서드이다.
이 예제에서는 값이 0 이상인 동안에는 건너뛰고 그 이후에 나오는 요소를 구한다.

var numbers = new List<int> { 9, 7, 5 };
var selected = numbers.SkipWhile(n => n >= 0).ToList();

 

중복을 제거한다

 

LINQ에 있는 Distinct 메서드
숫자값 리스트에서 중복을 제거한 새로운 리스트를 생성하는 예

var numbers = new List<int> { 1, 2, 3, 1, 2 };
var results = numbers.Distinct();

 

순서대로 나열

 

LINQ에 있는 OrderBy 메서드를 사용하면 순서대로 나열할 수 있다.
books 컬렉션을 가격이 저렴한 순서로 나열한다.

var sortedBooks = books.OrderBy(x => x.Price);


가격이 높은 순서로 정렬하고 싶다면 OrderByDescending 메서드를 사용한다.

var sortedBooks = books.OrderByDescending (x => x.Price);

 

컬렉션을 연결

 

LINQ에 있는 Concat 메서드를 사용하면 두 개의 컬렉션을 연결할 수 있다.

var allfiles = files1.Concat(files2);