OfType() 메서드는 컬렉션의 각 요소를 지정된 타입을 기준으로 필터링할 때 사용하는 LINQ 확장 메서드입니다. 특히 IList, ArrayList처럼 다양한 타입의 요소가 섞여 있는 비제네릭 컬렉션에서 원하는 타입의 값만 깔끔하게 추출할 수 있어 매우 유용합니다.
OfType() 메서드란?
OfType<T>()는 컬렉션을 순회하면서 T 타입과 호환되는 요소만 골라내어 새로운 시퀀스로 반환합니다. 타입이 일치하지 않는 요소는 예외를 발생시키지 않고 자동으로 제외되기 때문에, 혼합 타입 컬렉션을 안전하게 처리할 수 있습니다.
사용 예시
예를 들어, 문자열과 정수가 함께 들어 있는 다음과 같은 리스트가 있다고 가정해 보겠습니다.
list.Add("Katie");
list.Add(100);
list.Add(200);
문자열(string) 타입만 필터링하기
OfType<string>()을 사용하면 리스트에서 문자열 요소만 추출할 수 있습니다.
var myStr = from a in list.OfType<string>() select a;
정수(int) 타입만 필터링하기
같은 방식으로 정수 타입에도 적용할 수 있습니다.
var myInt = from a in list.OfType<int>() select a;
전체 예제 코드
다음은 OfType() 메서드의 동작을 확인할 수 있는 전체 코드입니다.
using System;
using System.Linq;
using System.Collections;
public class Demo {
public static void Main() {
IList list = new ArrayList();
list.Add("Katie");
list.Add(100);
list.Add(200);
list.Add(300);
list.Add(400);
list.Add("Brad");
list.Add(600);
list.Add(700);
var myStr = from a in list.OfType<string>() select a;
var myInt = from a in list.OfType<int>() select a;
Console.WriteLine("Strings...");
foreach (var strVal in myStr) {
Console.WriteLine(strVal);
}
Console.WriteLine("Integer...");
foreach (var intVal in myInt) {
Console.WriteLine(intVal);
}
}
}
실행 결과
Strings... Katie Brad Integer... 100 200 300 400 600 700
핵심 정리
OfType<T>()는 컬렉션에서 T 타입과 호환되는 요소만 필터링하여 반환합니다.- 타입이 맞지 않는 요소는 예외 없이 조용히 건너뛰므로 안전하게 사용할 수 있습니다.
ArrayList와 같이 여러 타입이 혼재된 비제네릭 컬렉션을 처리할 때 특히 효과적입니다.- 반환 결과는
IEnumerable<T>이므로 LINQ 쿼리나foreach문에서 바로 활용할 수 있습니다.