Unity 이론 (람다 특징, SQO, LinQ, List)

로젠·2024년 5월 27일
0

게임 프로그래밍

목록 보기
48/49
post-thumbnail

지연된 실행

지연된 실행은 영어로 Deffered Executing으로 해당 함수를 호출하면 한 줄 리턴해준다. 아래의 식을 보면 patents는 배열 형태로 이루어져 하나씩 돌아가면서 출력해 주기 때문에 배열의 첫 번째가 들어오면 print("Lambda_" + patent.Title);에서 먼저 출력을 하고 그다음 Print(patents);에서 출력이 된 후 다음 배열로 넘어간다.

private void Start()
{
	IEnumerable<Patent> patents = patents.Where(patent =>
	{
		if (patent.YearOfPublication.StartsWith("18"))
        {
			print("Lambda_" + patent.Title);
			return true;
		}
		return false;
	});
	print("-- patents");
	Print(patents);
}

클로저

Closure은 콜이 될 때 변수를 캡처하여 실행하는 것이다. Closure은 주소를 갖는 함수를 의미하고 폐쇄라는 뜻을 가지고 있다. Closure은 호출 시 외부에 임시 메모리 풀이 생기고 해당 함수는 재활용이 가능하고 식이 끝나는 }를 만나게 된다면 삭제된다.

캡처

캡처는 클로저를 실행했을 때 하게 되는 것이다.

private sealed class DisplayClass0 //클로저
{
	ref public int input; //캡처
	int <Start>a__0(int val)
	{
		return input += val;
	}
}

OrderBy/ OrderByDescending

OrderBy는 C#에서 Sort와 같은 것으로 정렬을 해준다. OrderByDescending은 내림차순으로 정렬해 주는 방식이다.

private void Start()
{
	IOrderedEnumerable<Patent> titleOrderBy = Datas.Patents.OrderBy(patent => 	patent.Title); //Sort
	print("-- Order By");
	Print(titleOrderBy);
	Patent[] patents8 = Datas.Patents.OrderByDescending(patent => 	patent.Title).ToArray();
	print("-- Order By Decending");
	Print(patents8);
}

ThenBy/ ThenByDescending

ThenBy나 ThenByDescending은 해당 코드에서 이미 OrderBy나 OrderByDescending을 사용하였을 때 2차 정렬을 하기 위해 사용한다. ThenBy는 오름차순 ThenByDescending은 내림차순으로 2차 정렬뿐 아니라 그 뒤에 계속 정렬을 해주고 싶을 때 계속 사용할 수 있다.

private void Start()
{
	IEnumerable<Inventor> inventors = Datas.Inventors.Where(
		inventor => inventor.Country.Equals("USA"))
		.OrderBy(Inventor => Inventor.City)
		.ThenByDescending(Inventor => Inventor.Name);
    Print(inventors);
}

ToArray/ ToList

ToArray을 사용하면 원하는 식을 배열로 바꿔줄 수 있고 ToList를 사용하면 List로 바꿔줄 수 있다.

private void Stat()
{
	IEnumerable<FileInfo> fileInfos = files.Select(fileName => new 	FileInfo(fileName));
	FileInfo[] fileinfos2 = files.Select(fileName => new 	FileInfo(fileName)).ToArray();
}
private void Start()
{
	List<string> fileInfos6 =(from file in fileInfo5 select file.Name).ToList();
}

익명 형식

익명 형식은 따로 형을 지정하지 않고 값을 대입하면 형태에 맞게 형을 지정해 주는 것을 말한다.

private void Start()
{
  	var fileItems2 = fileItems
            .Where(file => file.FileName.StartsWith("e", StringComparison.CurrentCultureIgnoreCase))
            .OrderBy(file => file.Size);
}

OfType

OfType는 해당 형식으로 캐스트 할 수 있는지에 따라 값을 선택해 준다.

private void Start()
{
  	IEnumerable<int> odd = stuff.OfType<int>();
}

Concat

Concat은 두 개 이상의 배열을 합쳐주는 것을 말한다.

private void Start()
{
  	IEnumerable<int> concat = even.Concat(odd);
}

Union

Union은 두 개 이상의 배열을 합쳐줄 때 중복되는 부분을 빼고 합쳐주는 것을 말한다.

Distinct

Distinct는 배열에서 중복되는 부분이 있을 때 중복되는 부분을 처리해 주는 것을 말한다.

private void Start()
{
	IEnumerable<int> distinct = even.Concat(odd).OrderByDescending(val => val).Distinct(); //Distinct 중복 제거
}

Count

Count는 개수를 세어주는 것으로 원하는 IEnumerable의 개수를 구할 수 있다.

private void Start()
{
	print($"Count = {numbers.Count()}");
	print($"Count2 = {numbers.Count(val => val > 5)}");
}

Sum

Sum은 원하는 정수형 IEnumerable의 합을 구해주는 것을 말한다.

private void Start()
{
  	print($"Sum = {numbers.Sum()}");
}

Average

Average는 평균으로 원하는 정수형 IEnumerable의 평균을 구해주는 것을 말한다.

private void Start()
{
  	print($"Average = {numbers.Average()}");
}

MIN/ MAX

MIN은 제일 작은 숫자를 MAX는 가장 큰 숫자가 무엇인지를 구해주는 것이다.

private void Start()
{
	print($"Min = {numbers.Min()}");
	print($"Max = {numbers.Max()}");
}

SQL -> Select

Select는 선택이라는 뜻으로 SQL의 Select를 사용할 때 다음과 같이 나타낸다.

private void Start()
{	
	IEnumerable<string> patent4 = patents.Select(patents => patents.Title);
}

from in select

from in select는 SQL의 형이 아닌 LinQ의 형으로 select를 할 때 사용한다.

private void Start()
{
  	IEnumerable<Patent> patents2 = from patent in Datas.Patents select patent;
}

where

LinQ에서 where은 SQL에서 Where과 같이 해당 조건에 맞는 값을 리턴해준다.

private void Start()
{
  	IEnumerable<Patent> patent4 =
		from patent in Datas.Patents
		where patent.Title.StartsWith("B")
		select patent;
}

orderby ascending/ decending

orderby ascending은 오름차순으로 정렬 orderby decending은 내림차순으로 정렬하는 것을 말한다.

private void Start()
{
  	IEnumerable<Patent> patents5 =
		from patent in Datas.Patents
		orderby patent.YearOfPublication descending, patent.Title ascending			select patent;
}

let

let은 결과에 대한 식별자를 도입할 수 있고 이는 여러 번 계산할 수 없도록 저장도 가능하다.

private void Start()
{
  	var fileInfo5 =
		from file in files
		let fileInfo = new FileInfo(file)
		orderby fileInfo.Length, file
		select new
		{
			Length = fileInfo.Length,
			Name = file
		};
}

ForEach (List)

ForEach는 List 형식을 foreach로 간단하게 한 줄로 표시할 수 있다.

private void Start()
{
	List<string> fileInfos6 =(from file in fileInfo5 select file.Name).ToList();
	fileInfos6.ForEach(fileName => print(fileName));
}

0개의 댓글