LINQ는 어떤 문제 도메인을 위해 만들어 졌습니까?


12

C #의 스택 오버플로에 게시 된 질문을 볼 때마다 LINQ 관련 문제를 해결하는 하나 이상의 답변이 게시되어 있습니다. 일반적으로 명성이 높은 사람들은 전문가처럼 LINQ를 사용하는 것 같습니다.

제 질문은 LINQ가 어떤 문제 도메인에 사용되어야 하는가입니다.

또한 참고 사항 : 피해야 할 목적이 있습니까? 데이터 세트 크기가 LINQ 쿼리 성능에 영향을 줍니까?




1
LINQ는 객체 그래프를 쿼리하기위한 것입니다. 언어 통합 쿼리-컬렉션을 쿼리하고 조작 할 수 있습니다.
오디드

1
linq가 어떤 문제에 잘 맞는지에 대한 좋은 질문이있을 수 있습니다
.

1
Linq는 선언적입니다. "방법"을 지정하지 않고 "무엇을 원하는지"말하십시오. linq의 경우 쿼리를 사용하여 원하는 것을 지정할 수 있습니다. 일부 문제의 경우 선언적 코드가 더 짧고 이해하기 쉽습니다.
mike30

답변:


16

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 개 정도) 또는 프로젝트 오일러 )에 잘 매핑됩니다 .


이 질문을 지금 삭제해야 할 수도 있습니다. 중재자는 커뮤니티에 적합하지 않다고 언급했습니다. 다른 느낌이들 경우 알려주십시오.
user1816120

1
LINQ에 다시 쓰고 원본을 여전히 읽을 수있는 경우 원본을 유지하고 LINQ 버전을 제거하십시오. 때때로 LINQ는 아무것도 추가하지 않습니다.
svick

이론적으로 @svick 예, 이것의 예를 생각할 수 있을지 모르겠습니다.;)
jk.

1
@jk. 예를 들어 ReSharper는 때때로을 사용하여 루프를 LINQ로 변환하도록 제안합니다 Aggregate(). 나는 대부분 루프가 더 읽기 쉽다고 생각합니다.
svick

@svick은 아마도 당신이 익숙한 문제 일 것입니다. 그러나 집계는 fold
jk

1

편집 된 질문에 대답하려면 간단히 말해서 "쿼리"기능을 구현해야 할 때마다 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는 많은 "일상"데이터 쿼리 문제를 종종 더 짧고 더 자기 설명적인 방식으로 해결합니다. 이것은 구문과 기술을 배우는 데 드는 비용이 약간 들지만 이점은 부정적인 것보다 훨씬 큽니다.


"쿼리"로 맵 또는 폴드를 분류합니까? 난 정말하지 않습니다하지만 난, 계산의 결과로 아마는 "쿼리".. 내가 일반적으로 골재의 생각을 볼 수도 있겠죠
지미 호파

@JimmyHoffa 나는 주로 계산 자체가 아니라 기본 컬렉션에 계산을 적용하는 것을 주로 언급하고 있습니다. 그러나 내 비유에는 아마도 틈이있을 수 있습니다 .100 % 정확하기보다는 예시 적이어야합니다.
Daniel B

쿼리와 함께 시작하는 것입니다 무엇의 엄격한 정의가있는 경우 @JimmyHoffa 더,하지만 잘 모르겠어요 없습니다
JK.

0

관계형 데이터베이스 용 SQL 및 XQuery for XML과 같이 다양한 유형의 데이터 소스에 대해 여러 언어가 개발되었습니다. 따라서 개발자는 지원해야하는 각 유형의 데이터 소스 또는 데이터 형식에 대해 새로운 쿼리 언어를 배워야했습니다. LINQ는 다양한 종류의 데이터 소스 및 형식에서 데이터 작업을위한 일관된 모델을 제공하여 이러한 상황을 단순화합니다. LINQ 쿼리에서는 항상 개체를 사용합니다. 자세한 내용은 http://msdn.microsoft.com/en-us/library/bb397906.aspx 를 참조하십시오 .


정확히 LINQ는 컬렉션 작업을위한 추상화 API입니다. 몇 가지 중요한 이점 : C #을 사용하면 정적입니다! 쿼리 및 변환 확인
AndreasScheinert
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.