C #의 스택 오버플로에 게시 된 질문을 볼 때마다 LINQ 관련 문제를 해결하는 하나 이상의 답변이 게시되어 있습니다. 일반적으로 명성이 높은 사람들은 전문가처럼 LINQ를 사용하는 것 같습니다.
제 질문은 LINQ가 어떤 문제 도메인에 사용되어야 하는가입니다.
또한 참고 사항 : 피해야 할 목적이 있습니까? 데이터 세트 크기가 LINQ 쿼리 성능에 영향을 줍니까?
C #의 스택 오버플로에 게시 된 질문을 볼 때마다 LINQ 관련 문제를 해결하는 하나 이상의 답변이 게시되어 있습니다. 일반적으로 명성이 높은 사람들은 전문가처럼 LINQ를 사용하는 것 같습니다.
제 질문은 LINQ가 어떤 문제 도메인에 사용되어야 하는가입니다.
또한 참고 사항 : 피해야 할 목적이 있습니까? 데이터 세트 크기가 LINQ 쿼리 성능에 영향을 줍니까?
답변:
LINQ는 기본적으로 일련의 데이터에 대한 순수 기능 쿼리 및 변환을 허용하도록 설계되었습니다 (모든 LINQ 확장은 Func 대리자를 취하지 만 Action 대리자는받지 않음). 결과적으로 LINQ와 잘 맞지 않는 가장 일반적인 루프 사례는 순수하지 않은 기능적 부작용에 관한 것입니다.
foreach(var x in list) Console.WriteLine(x);
LINQ를 더 잘 사용하려면 사용을 연습하십시오.
컬렉션으로 무언가를 수행하기 위해 for
또는 foreach
루프 를 작성하려고 할 때마다 중지하고 LINQ에 적합한 지 고려하십시오 (즉, 요소에 대한 조치 / 부작용을 수행하는 것이 아니라). LINQ를 사용합니다.
foreach
먼저 버전을 작성한 다음 LINQ 버전으로 다시 쓸 수도 있습니다 .
svick이 지적했듯이 LINQ는 프로그램을 더 읽기 쉽게 만드는 것입니다. 메커니즘보다는 코드의 의도를 강조하는 경향이 있기 때문에 일반적으로이 방법이 좋습니다. 그러나 간단한 루프보다 쿼리를 더 읽기 쉽게 만들 수 없다면 루프를 고수하십시오.
연습 할 연습이 필요한 경우 대부분의 기능적 프로그래밍 연습은 LINQ (예 : 99 개 문제 (특히 처음 20 개 정도) 또는 프로젝트 오일러 )에 잘 매핑됩니다 .
Aggregate()
. 나는 대부분 루프가 더 읽기 쉽다고 생각합니다.
편집 된 질문에 대답하려면 간단히 말해서 "쿼리"기능을 구현해야 할 때마다 LINQ를 사용하는 것이 좋습니다 (LINQ의 Q가 나타내는 것). 정확한 도메인을 정의하는 것은 어렵지만 컬렉션에서 데이터를 추출하고 조작하는 것과 관련된 다양한 작업을 크게 단순화합니다.
약간의 설명을 위해 많은 쿼리 기능이 언어 (또는 다양한 LINQ 구현 자)에 직접 도입되었으므로 집계, 순서 지정, 그룹화, 필터링, 프로젝션, 조인 (및 기타) 등이 모두 처리됩니다. 당신. LINQ 기반 솔루션은 일반적으로 "수동으로"구현하는 것보다 훨씬 짧으며 의도를 훨씬 더 잘 전달합니다.
LINQ의 강력한 기능을 전달하는 데 도움이되는 간단한 예는 확장명별로 그룹화 된 디렉토리의 내용을 표시하는 것입니다. 머리 속에 전형적인 명령형 구현을 실행하십시오. 초기에 이미 구현 세부 사항이 많이 있습니다. 아마도 우리는 Dictionary<String, List<String>>
확장자로 파일을 색인하기 위해 a 를 사용할 것 입니다. 물론, 키가 이미 존재하는지 확인하고, 목록을 인스턴스화하고, 추가하는 등의 작업을 수행해야합니다.
Dictionary<string, List<string>> fileGroups = new Dictionary<string, List<string>>();
foreach (string file in Directory.GetFiles(Environment.CurrentDirectory))
{
string extension = Path.GetExtension(file).ToLower();
if (!fileGroups.ContainsKey(extension))
{
fileGroups[extension] = new List<string>();
}
fileGroups[extension].Add(file);
}
LINQ와 동등한 것을 고려하십시오.
var query = from file in Directory.GetFiles(Environment.CurrentDirectory)
group file by Path.GetExtension(file).ToLower();
쿼리 자체는 2 줄에 불과하며, 우리가 생각해 낼 수있는 명령 솔루션보다 확실히 짧습니다. 또한 꽤 읽을 수 있습니다. 신호 대 잡음비는 첫 번째 솔루션보다 높았습니다. LINQ를 처음 사용하는 사용자의 경우 해당 쿼리 결과를 다음과 같이 출력합니다.
foreach (var fileGroup in query)
{
Console.WriteLine(String.Format("*** Files with extension: {0}", group.Key));
foreach (string file in fileGroup)
{
Console.WriteLine(file);
}
}
더 복잡한 예를 들어, 차이는 일반적으로 훨씬 더 커집니다 (예를 들어 단순히 여러 필드로 그룹화하는 것을 고려하십시오). 요약하자면, LINQ는 많은 "일상"데이터 쿼리 문제를 종종 더 짧고 더 자기 설명적인 방식으로 해결합니다. 이것은 구문과 기술을 배우는 데 드는 비용이 약간 들지만 이점은 부정적인 것보다 훨씬 큽니다.
관계형 데이터베이스 용 SQL 및 XQuery for XML과 같이 다양한 유형의 데이터 소스에 대해 여러 언어가 개발되었습니다. 따라서 개발자는 지원해야하는 각 유형의 데이터 소스 또는 데이터 형식에 대해 새로운 쿼리 언어를 배워야했습니다. LINQ는 다양한 종류의 데이터 소스 및 형식에서 데이터 작업을위한 일관된 모델을 제공하여 이러한 상황을 단순화합니다. LINQ 쿼리에서는 항상 개체를 사용합니다. 자세한 내용은 http://msdn.microsoft.com/en-us/library/bb397906.aspx 를 참조하십시오 .