C#의 LINQ 문의 람다 식
이 간단한 문서는 LINQ Select
쿼리의 람다 식에 관한 것입니다. 이를 위해 먼저 LINQ, 구문 및 람다 식에 대한 간략한 소개에 대해 설명합니다.
또한 LINQ Select
쿼리에서 람다 식을 사용하는 방법을 설명합니다.
C#
의 LINQ
LINQ는 Language Integrated Query의 약자입니다. 개체, XML, SQL 데이터 서버, 데이터 세트 등과 같은 여러 데이터 소스에서 데이터를 쿼리하는 데 사용되는 단일 형식입니다.
해당 데이터 소스에 대한 유일한 요구 사항은 IEnumerable<T>
인터페이스를 구현하는 것입니다.
LINQ는 여러 이점을 제공합니다.
- LINQ는 데이터의 출처에 관계없이 개체 기반의 언어 통합 쿼리를 제공합니다. 따라서 LINQ를 사용하여 데이터베이스, XML 및 컬렉션을 쿼리할 수 있습니다.
- 컴파일 시 구문 확인.
- SQL을 사용하여 데이터베이스를 쿼리하는 것처럼 VB 또는 C#과 같은 응용 프로그램의 기본 언어로 배열, 열거 가능한 클래스 등과 같은 컬렉션을 쿼리할 수 있습니다.
숫자 목록이 있고 10보다 작은 숫자를 선택해야 하는 시나리오를 생각해 보세요. 그러면 LINQ 쿼리가 데이터를 선택하는 데 도움이 될 수 있습니다.
아래의 코드 세그먼트를 살펴보겠습니다.
using System;
using System.Collections.Generic;
using System.Linq;
namespace ConsoleApp6 {
class Program {
static void Main(string[] args) {
List<int> listOfNumbers = new List<int>() { 16, 11, 2, 5, 9, 8, 7, 6, 1, 12 };
var result = from l in listOfNumbers
where l<10 select l;
foreach (int i in result) Console.WriteLine(i);
}
}
}
위의 LINQ 쿼리에서 이것이 SQL 데이터베이스에서 데이터를 쿼리하는 데 사용하는 쿼리 구문과 유사하다는 것을 알 수 있습니다. 여기서는 로컬 데이터 멤버 List
에서 데이터를 쿼리하고 있습니다.
코드 세그먼트의 출력은 다음과 같습니다.
C#
의 LINQ 구문
LINQ로 프로그래밍하는 동안 사용되는 LINQ 구문에는 두 가지가 있습니다.
- 쿼리 구문
- 메소드 구문
LINQ의 쿼리 구문
LINQ 쿼리 구문은 .NET Framework 버전 3.5 이상에 정의된 쿼리 키워드 집합으로 구성됩니다. 이를 통해 프로그래머나 개발자는 따옴표를 사용하지 않고 코드(C# 또는 VB.NET)에 SQL 스타일 명령을 작성할 수 있습니다.
쿼리 식 구문이라고도 합니다.
from
키워드는 LINQ 쿼리 구문을 시작하고 Select
또는 GroupBy
키워드로 끝납니다. 키워드에 따라 필요에 따라 필터링, 그룹화 등 다양한 표준 쿼리 작업을 사용할 수 있습니다.
아래 예에서는 쿼리 구문을 사용하여 목록에서 데이터를 가져옵니다.
using System;
using System.Linq;
using System.Collections.Generic;
class LinqExample {
static public void Main() {
List<string> myList = new List<string>() { "Cat", "Dog", "Tiger", "Wolf" };
// Create LINQ Query
var result = from a in myList select a;
// Executing the query
foreach (var r in result) {
Console.WriteLine(r);
}
}
}
그러면 다음과 같은 출력이 생성됩니다.
LINQ의 메서드 구문
메서드 구문은 LINQ에서 Enumerable 또는 Queryable 정적 클래스의 확장 메서드를 호출하는 데 사용됩니다. 메서드 확장 구문이라고도 합니다.
반면에 컴파일러는 컴파일 타임에 항상 쿼리 구문을 메서드 구문으로 변환합니다. Select
, Where
, GroupBy
, Join
, Max
등과 같은 표준 쿼리 연산자를 사용할 수 있습니다.
쿼리 구문을 사용하지 않고 직접 호출할 수 있습니다.
아래 예에서는 메서드 구문을 사용하여 이름 길이가 3보다 큰 동물의 이름을 가져옵니다. 쿼리는 다음과 같이 구성됩니다.
var result = myList.Where(a => a.Length > 3);
메서드 구문의 전체 코드는 다음과 같습니다.
using System;
using System.Linq;
using System.Collections.Generic;
class LinqExample {
static public void Main() {
List<string> myList = new List<string>() { "Cat", "Dog", "Tiger", "Wolf" };
// Create LINQ Query
var result = myList.Where(a => a.Length > 3);
// Executing the query
foreach (var r in result) {
Console.WriteLine(r);
}
}
}
그러면 다음과 같은 결과가 나타납니다.
메서드 구문에서 =>
기호로 구성된 Where
함수의 인수에 표현식이 있음을 알 수 있습니다. 이 특이한 것은 람다 식으로 알려져 있습니다.
다음 섹션에서는 람다 식과 LINQ 쿼리의 사용에 대해 설명합니다.
C#
의 람다 식
C#에서 람다 식은 익명 함수와 유사하게 사용되지만 람다 식을 사용할 때 입력하는 값의 유형을 지정할 필요가 없다는 점을 제외하면 더 유연합니다.
모든 람다 식은 =>
기호로 표시되는 람다 연산자를 사용합니다. 입력은 람다 식의 왼쪽에 있고 식은 오른쪽에 있습니다.
람다 식은 두 가지 형식으로 분류됩니다.
- 식 람다
- 진술 람다
식 람다
이는 입력 문과 람다 기호 오른쪽에서 평가할 식으로 구성됩니다.
input statement => expression
성명서 람다
이것은 입력 문과 람다 기호의 오른쪽에 있는 문 집합으로 구성됩니다.
input statements => { set of statements }
일부 숫자로 구성된 목록
데이터 구조가 있고 모든 목록 번호의 큐브를 평가해야 한다고 가정합니다. 이는 람다 식을 사용하여 매우 간단하게 수행할 수 있습니다.
이는 아래 코드 세그먼트에서 확인할 수 있습니다.
using System;
using System.Collections.Generic;
using System.Linq;
namespace ConsoleApp6 {
class Program {
static void Main(string[] args) {
List<int> listOfNumbers = new List<int>() { 16, 11, 2, 5, 9, 8, 7, 6, 1, 12 };
var cubes = listOfNumbers.Select(a => a * a * a);
// Display all the cubes
Console.Write("Cubes of the List : ");
foreach (var val in cubes) {
Console.Write("{0} ", val);
}
}
}
}
위의 코드 세그먼트에서 Select
기능을 사용하여 목록에서 요소를 선택한 다음 람다 식을 사용하여 큐브를 만든 것을 볼 수 있습니다.
세그먼트의 출력은 다음과 같습니다.
LINQ의 람다 식
Lambda 식과 LINQ는 모든 데이터 소스에서 데이터를 쿼리하는 방법을 제공합니다. 다음은 LINQ Lambda 구문을 사용하여 데이터를 쿼리하는 몇 가지 예입니다.
속성으로 roll_num
, name
및 marks
가 포함된 Student
라는 사용자 정의 클래스가 있다고 가정합니다. 학생 목록의 일부 데이터를 초기화한 다음 LINQ 쿼리 및 람다 식을 사용하여 데이터를 쿼리합니다.
class Student {
private int roll_num;
private string name;
private int marks;
public int Roll_num {
get => roll_num;
set => roll_num = value;
}
public string Name {
get => name;
set => name = value;
}
public int Marks {
get => marks;
set => marks = value;
}
}
Main
기능에서 Student
클래스 목록을 생성한 다음 여기에서 데이터를 쿼리합니다.
static void Main(string[] args) {
List<Student> students =
new List<Student>() { new Student { Roll_num = 1, Name = "David", Marks = 65 },
new Student { Roll_num = 2, Name = "John", Marks = 90 },
new Student { Roll_num = 3, Name = "Dina", Marks = 87 },
new Student { Roll_num = 4, Name = "Leen", Marks = 43 },
new Student { Roll_num = 5, Name = "Krish", Marks = 57 } };
}
목록을 만든 후 점수가 60점보다 큰 학생을 선택하여 사용자에게 표시해야 한다고 가정합니다. 이를 위해 람다 식과 LINQ 쿼리를 사용합니다.
Console.WriteLine("Through Lambda Expression");
IEnumerable<Student> sortedData = students.Where(x => x.Marks > 60);
foreach (var s in sortedData) Console.WriteLine(s.Roll_num + " " + s.Name + " " + s.Marks);
Console.WriteLine("Through LINQ query");
IEnumerable<Student> result = from s in students
where s.Marks> 60 select s; foreach (var s in sortedData) Console.WriteLine(s.Roll_num + " " + s.Name + " " + s.Marks);
위의 코드 세그먼트에서 동일한 데이터를 두 가지 다른 방식으로 선택했습니다. Lambda 문을 통해 데이터 쿼리가 매우 간단하고 LINQ 쿼리보다 적은 코딩이 필요합니다.
출력은 두 경우 모두 동일합니다.
이전 예에서는 학생의 모든 데이터를 표시했습니다. 60점보다 높은 점수를 받은 학생의 이름을 가져와야 하는 경우 람다 식은 다음과 같습니다.
var stuNames = students.Where(x => x.Marks > 60).Select(x => x.Name);
foreach (var s in stuNames) Console.WriteLine(s);
그러면 학생의 이름만 반환됩니다. 따라서 IEnumerable
유형에 저장하지 않았습니다.
출력은 다음과 같습니다.
학생들의 이름과 점수를 원하지만 먼저 점수를 기준으로 정렬해야 한다고 가정합니다. OrderBy
기능을 사용하여 데이터를 정렬합니다.
var stuNames = students.OrderBy(x => x.Marks).Select(x => new { x.Name, x.Marks });
foreach (var s in stuNames) Console.WriteLine(s.Name + " " + s.Marks);
출력은 다음과 같습니다.
따라서 다양한 메서드가 람다 식을 사용하여 데이터를 쿼리할 수 있음을 알 수 있습니다. 람다 식은 방대한 데이터가 있고 데이터에 다양한 작업을 쿼리하거나 적용하기 위해 최소한의 코딩 단계가 필요한 경우에 유용합니다.