2009-11-24 5 views
3

새 프로젝트를 시작할 때 참조를 제거하지 않아도 Linq를 사용하지 않을 것입니다. 그래도 람다는 유용 해 보인다. Linq가 타기를 위해 태그를 지정해야한다면 lambdas를 사용하는 습관을 가지지 않을 것입니다.lambda는 Linq없이 사용할 수 있습니까?

미리 감사드립니다.

+7

왜 Linq를 사용하지 않으시겠습니까? 당신은 heritance 나 function call을 피해야 할 수도 있습니다. 그것은 이유의 이유로 언어의 일부이며,보다 깔끔하고 단순하며 더 나은 코드를 작성할 수 있습니다. – jalf

+2

LINQ는 다양한 것을 말합니다. LINQ-to-SQL은 LINQ-to-XML과 다르며 람다와 결합하면 강력한 개체 쿼리 기능을 사용할 수 있습니다. 궁금합니다. LINQ에 대한 참조를 제거하면 어떤 이점이 있습니까? – mkelley33

+3

@jalf : Jon Skeet이 이미 작성한 것처럼 .NET 2.0을 대상으로 할 때 람다를 사용할 수 있지만 LINQ는 사용할 수 없습니다. 저것은 (제 생각으로) 주된 이유입니다. – OregonGhost

답변

23

언제든지 람다를 사용할 수 있습니다. 그것들은 새로운 언어 기능입니다. Linq가 사용하지만 linq를 사용할 필요는 없습니다. 다만 익명 메소드와 같은

Action blah =() => { System.Console.WriteLine("Hello World!"); } 
blah(); // will write Hello World! to the console 
3

아니, 당신이 사용할 수있는 람다는 더 LINQ이 필요하지 않습니다.

15

람다 식은 LINQ와 완전히 독립적입니다. VS2008 또는 VS2010의 .NET 2.0 프로젝트를 대상으로 할 때 실제로 사용할 수 있습니다. 마찬가지로 .NET 3.5를 사용하는 경우 LINQ를 사용하지 않고 표현 트리를 사용할 수 있습니다.

그러나 저는 LINQ를 피하지 말 것을 강력히 권장합니다. 이것은 대단히 강력한 도구입니다. 저는 개인적으로 Queryable을 통해 번역해야하는 LINQ 제공자를 경계합니다. 그들은 예측하기가 더 어렵습니다. 그러나 LINQ to Objects는 순금입니다. 그것에 대해 싫어하는 점은 무엇입니까? 쿼리 식은 당신을 넣어 것처럼 ... 그래서

var query = people.Where(p => p.Age >= 18) 
        .Select(p => p.Name); 

을 : 당신이 람다 표현식을 사용하여 "점 표기법"에 쿼리를 작성 할 수 있습니다 - 당신은 LINQ를 사용하기 위해 쿼리 식을 사용할 필요는 없습니다 그들에 대해 걱정할 필요가 없습니다.

편집 : 그냥 질문 자체에 대한 코멘트에 대응하기 위해 - LINQBridge 프로젝트를 통해, .NET 2.0 객체로 사용 LINQ를.

+0

14 초 꺾임 ... :( –

+0

성능 측면에서 LINQ는 얼마나 비싸습니까? 사전 (컨테이너 구조) 쿼리에는 만 사용하려고합니다. –

+2

많은 방법을 연결하는 쿼리가 성능 때문에 LINQ에서 벗어나지는 않을 것입니다. (프로파일 링으로 표시되는) 히트가 있으면 문제를 일으키는 정확한 * 쿼리를 변경합니다. –

2

람다는 절대적으로 linq없이 사용할 수 있습니다. 나는 항상 그렇게합니다. 다음은 code sample입니다. 다른 곳에서는 linq가없는 람다를 사용합니다.

3

람다 표현의 출처와 사용 이유를 이해하는 것이 중요합니다. 대부분의 사람들이 LINQ를 통해 lambda에 대해 듣는다는 사실은 사실이지만 LINQ는 익명 메소드에 대한 후임으로서 C# 언어 버전 3.0에 도입 된 기능을 구현하는 것입니다.

람다는 실제로 delegate과 함께 사용되며 람다를 사용할 때 실제로 수행하는 것은 delegate에 메소드를 할당하는 것입니다. 그러나 컴파일러는 람다 식을 사용하고 있기 때문에 delegate을 사용하고 있다고 추론 할 수 있기 때문에 delegate 키워드를 사용하지 않아도됩니다.

MyDel del = delegate (int x) {return x + 1;} ; // Using an anonymous method 
MyDel le1 = x => x + 1;      // Using a lambda expression 

가 호출 될 때까지 대리인이 그 방법을 실행하지 않는 것을 유의 사항 : 따라서 다음

같은 일이다. 따라서 람다 식에서 x => x + 1이 표시 되더라도 le1(someInt)에 전화 할 때까지 실제로 실행되지 않습니다. 위임자가 호출 될 때까지 쿼리가 실행되지 않는 LINQ에서이 작업을 보았을 수 있습니다.

간단히 말해서 (간결함을 알지 못합니다.) 람다는 클래스 몸체에 선언하지 않고도 짧은 방법으로 메소드 호출을 표현할 수있게 해줍니다.

다니엘 솔리스 (Daniel Solis)의 Illustrated C# 2008, pp.375-377.

관련 문제