C# 3.0에 추가된 기능 중 단연 돋보이는 기능은 LINQ다. LINQ라는 기능을 새롭게 추가하고 구현한

이유는 지연된 쿼리를 지원하고 다양한 데이터 저장소에 대해 쿼리를 수행할 수 있는 통합 구문을

제공하기 위해서다. 4장에서는 저장소의 유형과 상관없이 데이터를 쿼리하기 위해서 LINQ를 어떻게

활용할지 알아볼 것이다. 그리고 데이터 쿼리 외의 용도로 LINQ를 활용하는 방법도 알아볼 것이다.

LINQ의 목표는 데이터 소스의 유형과 상관없이 동일한 작업을 수행하는 코드를 손쉽게 작성하는

것이다. 하지만 동일한 구문으로 서로 다른 데이터 소스에 대해서 작업을 수행하는 수준을 넘어서

쿼리와 실제 데이터 소스를 연결해주는 쿼리 제공자를 자유롭게 구현할수 있는 기능도 함께 제공한

다. 쿼리 제공자의 기능과 구현 내용을 이해하면 LINQ의 동작 방식을 좀 더 명확하게 이해할 수 있다.

29. 컬렉션을 반환하기보다 이터레이터를 반환하는 것이 낫다.

30. 루프보다 쿼리 구문이 낫다

31. 시퀀스에 사용할 수 있는 조합 가능한 API를 작성하라

32. Action, Predicate, Function과 순회 방식을 분리하라

33. 필요한 시점에 필요한 요소를 생성하라

34. 함수를 매개변수로 사용하여 결합도를 낮춰라

35. 확장 메서드는 절대 오버로드하지 마라

36. 쿼리 표현식과 메서드 호출 구문이 어떻게 대응되는지 이해하라