본문 바로가기
C#/Enumerable (Linq)

[C#] OfType<T>() vs CAST<T>()

by 스누누피 2024. 12. 19.

Enumerable.OfType<T>()

  • 시퀀스 내의 <T>형식과 일치하는 요소만 반환, 필터 기능이라고 보면됨
  • 일치하지 않는 요소가 있어도 예외를 발생 하지 않음
object[] arr = { 1, "2", 3, "4", 5 };

var ofTypeArr = arr.OfType<int>();

Console.WriteLine(string.Join(", ", ofTypeArr)); // 1, 3, 5

int와 string 속성이 섞인 배열에서 int타입만 필터링 되었다.


Enumerable.Cast<T>()

  • 시퀀스 내의 모든 요소의 형식을 <T>타입으로 변환 시도
  • 만약 형 변환이 되지 않는 요소가 있을 경우 InvalidCastException 예외 발생
object[] arr = { 1, "2", 3, "4", 5 };

var castArr = arr.Cast<int>();

Console.WriteLine(string.Join(", ", castArr)); // System.InvalidCastException: 지정한 캐스트가 잘못되었습니다.

int로 cast를 시도했지만 "2" 와 "4"가 string 타입임으로 오류가 발생.

 

  • Cast<T> 메서드를 사용하면 제너릭이 아닌 컬렉션에서 표준 쿼리 연산자(Linq)를 호출할 수 있게 만든다.
System.Collections.ArrayList arrayList = new System.Collections.ArrayList();
arrayList.Add("string3");
arrayList.Add("string2");
arrayList.Add("string1");

List<string> lst = arrayList.Cast<string>().OrderBy(o => o).ToList();
Console.WriteLine(string.Join(", ", lst)); // string1, string2, string3

arrayList는 쿼리 연산자를 호출할 수 없지만 Cast<T>를 사용하여 OrderBy를 호출할 수 있게 만들어 주었다.

만약 arrayList에 다양한 속성이 들어있다면 OfType<T>을 사용해서 원하는 요소만 뽑아낼수도 있다.

'C# > Enumerable (Linq)' 카테고리의 다른 글

[C#] Enumerable.Union() 메서드  (0) 2024.12.13
[C#] Enumerable.FirstOrDefault() 메서드  (0) 2024.12.10
[C#] Linq (람다식 메서드)  (0) 2024.11.05
[C#] Linq (Enumerable 클래스)  (0) 2024.07.23