센로그

[C#] LINQ (Language Integrated Query) 본문

게임/Unity, C#

[C#] LINQ (Language Integrated Query)

seeyoun 2023. 7. 3. 17:13

LINQ (Language INtegrated Query)

C#에서, 데이터 집합에서 원하는 데이터를 찾기 위한 작업 (데이터 질의)

using System.Linq; 필요

class Program
{
  static void Main(string[] args)
  {
    string[] strArr = { "Car", "Bus", "Train", "Airplane", "Ship", "Boat" };

    var LINQresult = from str in strArr
                     where str.Contains("a") && str.Length > 3
                     orderby str.Length
                     select str;

    foreach (var str in LINQresult)
    	Console.Write(str + " ");
  }
}

 

실행 결과

 

※ 주의
LINQ는 박싱에서 가비지를 생성합니다. 성능이 문제라면 LINQ를 사용하지 마세요.
새로운 배열을 만드는 대신 for 루프와 리스트를 사용하세요.

 


LINQ 문법

문법은 간단하다

 

from 데이터 in 데이터집합

where 조건

orderby 정렬 기준

select 데이터

 

데이터 집합에 있는 데이터들 중, 조건에 만족하는 데이터를 찾아 선택하고 정렬 기준에 따라 정렬한다.

결과로는 IEnumerable <T> 타입이 나온다.

 

 

위의 코드를 다시 보자

class Program
{
  static void Main(string[] args)
  {
    string[] strArr = { "Car", "Bus", "Train", "Airplane", "Ship", "Boat" };

    var LINQresult = from str in strArr				//strArr에 있는 str 중에서
                     where str.Contains("a") && str.Length > 3	//a를 포함하고 있고, 길이가 3초과인 str들을
                     orderby str.Length				//Length를 기준으로 정렬해서
                     select str; 				//선택

    foreach (var str in LINQresult)
    	Console.Write(str + " ");
  }
}

이렇게 직관적으로 사용할 수 있다.

 

 

좀더 간단하게는,

static void Main(string[] args)
{
    string[] strArr = { "Car", "Bus", "Train", "Airplane", "Ship", "Boat" };

    var v = strArr.Where(c => c.Length > 3).Count();
    Console.WriteLine(v);
}

이런 식으로 원하는 기능만 사용할 수도 있다. (출력은 4)

 

static void Main(string[] args)
{
    string[] strArr = { "Car", "Bus", "Train", "Airplane", "Ship", "Boat" };

    var v = strArr.Where(c => c.Length > 3).Count();
    Console.WriteLine(v);
}

 


 LINQ to List/Array

기본적으로 LINQ의 반환 타입은 IEnumerable <T> 타입이다.

이를 List나 Array로 받고 싶으면, 나온 결과값에다 ToList() 또는 ToArray()를 사용하면 된다.

static void Main(string[] args)
{
    string[] strArr = { "Car", "Bus", "Train", "Airplane", "Ship", "Boat" };

    var vList = strArr.Where(str => str.Length > 3).ToList<string>();
    vList.ForEach(c => Console.Write(c + " "));

    var vArray = strArr.Where(str => str.Length > 3).ToList<string>();
    vArray.ForEach(c => Console.Write(c + " "));

}

 

출력

 


◆ LINQ - 지연 실행(Lazy execution)

LINQ는 데이터를 질의할 때 지연 실행을 한다.

static void Main(string[] args)
{
    var myList = new List<string>();
    myList.Add("one");
    var LINQresult = myList.Select(str => str + "hi");
    myList.Add("two");

    foreach (var x in LINQresult)
    {
        Console.WriteLine(x);
    }
}

위 코드를 실행하면, 'onehi two'가 아니라 'onehi twohi'가 나온다.

 

이유는 LINQ의 데이터 질의 시 지연 실행을 하기 때문이다.

LINQresult = myList.Select(str => str+"hi") 때 바로 str+hi를 하지 않고, foreach문에서 꺼내올 때가 되어서야 쿼리를 실행한다는 것이다. 

 

단, Count(), First(), ToList(), ToArray() 와 같은 메서드를 활용하면, 지연되지 않고 바로 실행된다. 

 

 

참고) https://blog.naver.com/PostView.nhn?isHttpsRedirect=true&blogId=dotnethelper&logNo=60104797637&categoryNo=0&parentCategoryNo=0&viewDate=&currentPage=2&postListTopCurrentPage=&isAfterWrite=true 

 


참고) LINQ의 where 및 orderby 문법에는 Func delegate가 사용된다.

 

참고) https://themangs.tistory.com/entry/C-%ED%95%A8%EC%88%98%ED%98%95-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D-LINQ

Comments