지연된 실행은 영어로 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는 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은 해당 코드에서 이미 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를 사용하면 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는 해당 형식으로 캐스트 할 수 있는지에 따라 값을 선택해 준다.
private void Start() { IEnumerable<int> odd = stuff.OfType<int>(); }
Concat은 두 개 이상의 배열을 합쳐주는 것을 말한다.
private void Start() { IEnumerable<int> concat = even.Concat(odd); }
Union은 두 개 이상의 배열을 합쳐줄 때 중복되는 부분을 빼고 합쳐주는 것을 말한다.
Distinct는 배열에서 중복되는 부분이 있을 때 중복되는 부분을 처리해 주는 것을 말한다.
private void Start() { IEnumerable<int> distinct = even.Concat(odd).OrderByDescending(val => val).Distinct(); //Distinct 중복 제거 }
Count는 개수를 세어주는 것으로 원하는 IEnumerable의 개수를 구할 수 있다.
private void Start() { print($"Count = {numbers.Count()}"); print($"Count2 = {numbers.Count(val => val > 5)}"); }
Sum은 원하는 정수형 IEnumerable의 합을 구해주는 것을 말한다.
private void Start() { print($"Sum = {numbers.Sum()}"); }
Average는 평균으로 원하는 정수형 IEnumerable의 평균을 구해주는 것을 말한다.
private void Start() { print($"Average = {numbers.Average()}"); }
MIN은 제일 작은 숫자를 MAX는 가장 큰 숫자가 무엇인지를 구해주는 것이다.
private void Start() { print($"Min = {numbers.Min()}"); print($"Max = {numbers.Max()}"); }
Select는 선택이라는 뜻으로 SQL의 Select를 사용할 때 다음과 같이 나타낸다.
private void Start() { IEnumerable<string> patent4 = patents.Select(patents => patents.Title); }
from in select는 SQL의 형이 아닌 LinQ의 형으로 select를 할 때 사용한다.
private void Start() { IEnumerable<Patent> patents2 = from patent in Datas.Patents select patent; }
LinQ에서 where은 SQL에서 Where과 같이 해당 조건에 맞는 값을 리턴해준다.
private void Start() { IEnumerable<Patent> patent4 = from patent in Datas.Patents where patent.Title.StartsWith("B") select patent; }
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은 결과에 대한 식별자를 도입할 수 있고 이는 여러 번 계산할 수 없도록 저장도 가능하다.
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로 간단하게 한 줄로 표시할 수 있다.
private void Start() { List<string> fileInfos6 =(from file in fileInfo5 select file.Name).ToList(); fileInfos6.ForEach(fileName => print(fileName)); }