본문 바로가기

C# 문법

[C#] Linq에서 특정 Type만 가져오기

Linq를 이용해서 특정타입만 필터링해서 가지고 오고 싶을경우가 있습니다. 이때 Where조건을 쓰는 방법도 있지만, 저는 주로 ofType을 사용합니다.

Cast를 이용해 강제 형변환시키면 되지 않나?

  • 이 경우는 내가 타입을 알고 있어서, 그 타입을 사용하겠다 사용할때만 사용이 가능합니다.
  • Cast<특정타입> 에서 이 특정타입에 맞지 않은 값이 오게되면, Error가 발생 합니다.

Cast < TResult >

public void Run()
{
    object[] obj = new object[] { (string)"양뱅", (int)33, (string)"동목", (string)"다방" };
    //object Array를 string 타입으로 Casting 을
    obj.Cast<string>()
        .Select(f => f)
        .ToList()
        .ForEach(f => Console.WriteLine(f));
}

결과

image

Where조건을 사용

  • Where조건을 이용해서, 해당 값의 GetType과 typeof를 이용해서 string 타입만을 필터링을 합니다.
    public void Run()
    {
      object[] obj = new object[] { (string)"양뱅", (int)33, (string)"동목", (string)"다방" };
      //만약 내가 Linq에서 String 타입만 가지고 오고 싶을경우 Where을 사용한다면?
      obj.Where(f=> f.GetType().Equals(typeof(string)))
          .Select(f => f)
          .ToList()
          .ForEach(f => Console.WriteLine(f));
    }

    OfType< TResult >

  • ofType<특정타입> 일 경우, 특정 타입에 해당하는 값만 가지고 옵니다. 그래서 저는 주로 ofType을 사용합니다.
    public void Run()
    {
      object[] obj = new object[] { (string)"양뱅", (int)33, (string)"동목", (string)"다방" };
      //만약 내가 Linq로 String 타입만 가지고 오고 싶을경우 ofTyps<string>을 사용한다.
      obj.OfType<string>()
          .Select(f => f)
          .ToList()
          .ForEach(f => Console.WriteLine(f));
    }

    결과

    양뱅
    동목
    다방