센로그
[C#] LINQ (Language Integrated Query) 본문
◆ 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() 와 같은 메서드를 활용하면, 지연되지 않고 바로 실행된다.
참고) LINQ의 where 및 orderby 문법에는 Func delegate가 사용된다.
'게임 > Unity, C#' 카테고리의 다른 글
[Unity] Awake(), Start(), OnEnable() 차이 (0) | 2023.07.07 |
---|---|
[C#] Boxing(박싱), UnBoxing(언박싱) (0) | 2023.07.04 |
[Unity] UnityEvent (유니티 이벤트) (0) | 2023.07.03 |
[C#] Delegate(대리자) - delegate, Func, Action, Predicate (0) | 2023.07.03 |
[Unity] Scriptable Object (스크립터블 오브젝트) (0) | 2023.06.30 |
Comments