2012-06-17 2 views
7

System.Xml처럼 SQL에 대한 쿼리를 사용할 수 있도록 Apple Property List (속성 목록) 파서 (바이너리, JSON 및 XML)에 LINQ 지원을 추가하고 싶습니다. 파일을 완전히 파싱하고 힙에 저장하여 작동합니다. (예 : System.Xml).클래스에 LINQ 추가

나는 인터넷 검색을하고 있으며 그 중 일부를 이해하지 못하는 것 같습니다 (나는 Using LINQ to SQL Classes 페이지가 많습니다). MSDN에 관한 가이드, 나는 어느 쪽이든을 이해하지 않는다. 내가 무엇을해야 하나?

답변

17

LINQ는 단순히 올바른 서명 등 Where 또는 Select LINQ 등이있을 것으로 예상되는 방법을 구현하는 수단을 구현. 일반적인 인식에도 불구하고 LINQ를 지원하기 위해 클래스에 IEnumerable 인터페이스를 구현할 필요가 없습니다. 그러나 당신에게 거의 무료로 Enumerable 클래스에 LINQ 방법의 전체 세트를 얻을 자동으로 IEnumerable 것이다 을 구현 - 당신은 단지 GetEnumerator를 구현해야하고 IEnumerator 클래스입니다.

내 블로그에 IEnumerable을 구현하는 방법에 대한 몇 가지 예가 있습니다 (이 게시물의 내용은 the Iterator pattern).

그러나 클래스를 열거 할 수 없다면 그렇게 할 필요가 없습니다. 적절한 LINQ 메서드를 직접 구현하면됩니다. LINQ는 C#이 컴파일되는 한 메서드가 정의되는 방식에 실제로 신경을 쓰지 않습니다. 당신이 쓰는 경우 즉, :

mpPlist.Where(p => p.Thing == "Thing").Select(p => p); 

만큼 그 컴파일로, LINQ가 작동합니다

from p in myPlist where p.Thing == "Thing" select p; 

C# 컴파일러는이 점을 변환합니다. 메서드의 올바른 서명을 보려면 MSDN 설명서의 list of LINQ query methods을보십시오. 예를 들어 (당신의 PListPListItem의 목록이라고 가정) :

public class PList 
{ 
    public IEnumerable<PListItem> Where(Func<PListItem, bool> predicate) 
    { 
    foreach (var item in this.items) 
    { 
     if (predicate(item)) 
     { 
     yield return item; 
     } 
    } 
    } 
} 

직접 방식으로 LINQ를 구현하는 동안 당신이 작동하는 방법을 통해 더 많은 제어 할 수 있습니다, 그것은 그것을 얻을 수있는 많은 더 많은 일입니다 그리고 반환 값의 의미와 LINQ 호출 연결 등을 이해해야합니다. 일반적으로 클래스가 IEnumerable을 구현하도록 만들 수 있고 C#이 모든 작업을 처리하게 만들면 훨씬 쉽게 작업을 수행 할 수 있습니다.

+2

btw, 멋진 블로그 글! –

1

개체에 대한 LINQ는 IEnumerable<t>에서 상속되는 모든 클래스에서 작동하므로 클래스의 해당 인터페이스를 상속하고 GetEnumerable 메서드를 정의하면 충분합니다.

다음 링크는 (은 LINQ를 언급하지 않지만, 그것은 작동합니다) IEnumerable 인터페이스를 구현하는 방법에 대해 설명합니다 http://codebetter.com/davidhayden/2005/03/08/implementing-ienumerable-and-ienumerator-on-your-custom-objects/

1

먼저는 IEnumerable을 구현해야합니다. 첫 읽기 - http://msdn.microsoft.com/en-us/library/9eekhta0.aspx

+0

상속 에서처럼 구현 하시겠습니까? –

+0

Into С # 당신은 상속받은 것처럼 선언하고 인터페이스에 정의 된 모든 멤버를 구현해야합니다. 예.당신은 설명 _void 부스트 (INT 멀티 플라이어)와 메서드가 포함 된 인터페이스를 _IBoostable_있는 경우에 _ 해당 'MyClass 클래스과 같이 작성해야합니다 : IBoostable 를 { 공공 무효 부스트 (INT 승수) { 해봐요 (승수); } } ' –