C#에서 List에 담긴 여러 요소 중 특정 조건을 만족하는 값들만 골라내고 싶다면, List<T> 클래스가 제공하는 FindAll() 메서드를 사용하면 됩니다.
FindAll() 메서드는 Predicate<T>(조건자) 델리게이트를 인수로 받으며, 조건이 참(true)인 모든 요소를 담은 새로운 List<T>를 반환합니다. 조건에 맞는 요소가 하나도 없으면 빈 리스트가 반환됩니다.
예제 1: 3의 배수 찾기
아래 예제에서는 정수 리스트에서 3으로 나누어 떨어지는(3의 배수) 요소만 추출합니다.
using System;
using System.Collections.Generic;
public class Demo {
private static bool demo(int i) {
return ((i % 3) == 0);
}
public static void Main(String[] args) {
List<int> list = new List<int>();
list.Add(9);
list.Add(15);
list.Add(20);
list.Add(40);
list.Add(50);
list.Add(60);
Console.WriteLine("List elements...");
foreach (int i in list) {
Console.WriteLine(i);
}
Console.WriteLine(" ");
// 조건자(demo)와 일치하는 모든 요소를 새 리스트로 반환
List<int> res = new List<int>(list.FindAll(demo));
Console.WriteLine("List that match the conditions...");
foreach (int i in res) {
Console.WriteLine(i);
}
}
}
출력 결과
List elements... 9 15 20 40 50 60 List that match the conditions... 9 15 60
실행 결과를 보면 전체 6개 요소 중 9, 15, 60만 3의 배수 조건을 만족하여 새 리스트에 담긴 것을 확인할 수 있습니다.
예제 2: 나머지 연산으로 특정 패턴 찾기
이번에는 100으로 나눈 나머지가 5인 수를 찾는 조건을 적용해 보겠습니다.
using System;
using System.Collections.Generic;
public class Demo {
private static bool demo(int i) {
return ((i % 100) == 5);
}
public static void Main(String[] args) {
List<int> list = new List<int>();
list.Add(900);
list.Add(1500);
list.Add(250);
list.Add(405);
Console.WriteLine("List elements...");
foreach (int i in list) {
Console.WriteLine(i);
}
Console.WriteLine(" ");
List<int> res = new List<int>(list.FindAll(demo));
Console.WriteLine("List that match the conditions...");
foreach (int i in res) {
Console.WriteLine(i);
}
}
}
출력 결과
List elements... 900 1500 250 405 List that match the conditions... 405
네 개의 요소 중 405만 “100으로 나눈 나머지가 5”라는 조건을 충족하므로, 결과 리스트에는 405 하나만 포함됩니다.
람다 식으로 더 간결하게 작성하기
별도의 메서드를 선언하지 않고 람다 식(lambda expression)을 사용하면 코드를 훨씬 간결하게 만들 수 있습니다.
List<int> res = list.FindAll(i => i % 3 == 0);
이처럼 FindAll()은 복잡한 반복문 없이 한 줄로 조건 필터링을 처리할 수 있어, LINQ의 Where()와 함께 C#에서 가장 널리 쓰이는 컬렉션 필터링 방법 중 하나입니다.