문제

나는 LUA를 위해 LINQ와 같은 것을 만드는 것에 대해 생각하고 있었고 LINQ가 어떻게 작동하는지 일반적인 아이디어를 가지고 있지만, 좋은 기사가 있는지 또는 누군가 C#이 LINQ를 가능하게하는 방법을 설명 할 수 있는지 궁금해했습니다.

참고 : 코드 바인딩을 생성하는 방법과 최종 사용자 구문이 아닌 모든 장면을 의미합니다.

도움이 되었습니까?

해결책

LINQ는 너무 많은 다른 것이기 때문에 질문에 대답하기가 어렵습니다. 예를 들어 C#을 고수하면 다음과 같은 사항이 관련됩니다.

  • 쿼리 표현식은 "쿼리 표현식없이"C#에 "사전 처리"되며 정상적으로 컴파일됩니다. 사양의 쿼리 표현식 부분은 실제로 짧습니다. 기본적으로 "주문은 Orderby/theby/etc"로 변환 된 것 이상으로 쿼리의 실제 의미에 대해 아무것도 가정하지 않는 기계적 번역입니다.
  • 대의원은 실행 가능한 코드로 특정 서명으로 임의의 행동을 나타내는 데 사용됩니다.
  • 발현 나무는 동일한 것을 나타내는 데 사용되지만 데이터로서 (예 : SQL을 검사하고 다른 형태로 번역 할 수 있음)
  • Lambda 표현식은 소스 코드를 대표 또는 표현 트리로 변환하는 데 사용됩니다.
  • 확장 방법은 대부분의 LINQ 제공 업체가 정적 메소드 호출을 함께 체인하는 데 사용됩니다. 이것은 간단한 인터페이스를 허용합니다 (예 : IEnumerable<T>) 더 많은 힘을 얻기 위해.
  • 익명 유형은 투영에 사용됩니다. 이는 다른 데이터 모음이있는 곳에서 해당 데이터의 각 측면의 비트를 원하지 않으면 익명 유형을 사용하면 함께 모을 수 있습니다.
  • 암시 적으로 입력 한 로컬 변수 (var)는 주로 익명 유형으로 작업 할 때 주로 사용되며, 유형의 이름을 명시 적으로 "말할 수없는 정적으로 입력 된 언어를 유지하기 위해 사용됩니다.
  • 반복자 블록은 일반적으로 LINQ에서 객체에 대한 프로세스 중 쿼리를 구현하는 데 사용됩니다.
  • 형식 추론은 모든 것을 훨씬 매끄럽게 만드는 데 사용됩니다. LINQ에는 많은 일반적인 방법이 있으며 유형의 추론이 없으면 정말 고통 스러울 것입니다.
  • 코드 생성은 모델 (예 : DBML)을 코드로 전환하는 데 사용됩니다.
  • 부분 유형은 생성 된 코드에 대한 확장 성을 제공하는 데 사용됩니다.
  • 속성은 LINQ 제공 업체에 메타 데이터를 제공하는 데 사용됩니다

분명히 많은 사람들은 그렇지 않습니다 LINQ에서 사용하지만 다른 LINQ 기술은 이에 따라 다릅니다.

관심있는 측면을 더 많이 표시 할 수 있다면 더 자세한 내용을 제공 할 수 있습니다.

LINQ를 대상으로 효과적으로 구현하는 데 관심이 있다면 DDD에서 몇 주 전에 읽은 대화에 관심이있을 수 있습니다. 기본적으로 한 시간 안에 가능한 한 많은 LINQ를 구현합니다. 우리는 끝까지 완전하지 않았지만 친절한 해야 할 일 (및 버퍼링/스트리밍, 반복자 블록, 쿼리 표현식 번역 등). 비디오는 아직 일어나지 않았습니다 (그리고 아직 다운로드를 위해 코드를 올리지 않았습니다) 그러나 관심이 있으시면 skeet@pobox.com으로 메일을 보내 주시면 UP가 언제 알려 드리겠습니다. . (아마도 그것에 대해 블로그도 할 것입니다.)

다른 팁

단핵증 (부분적으로?) LinQ를 구현하고 OpenSource입니다. 어쩌면 당신은 그들의 구현을 살펴볼 수 있습니까?

아마도 내 R6RS 체계의 LINQ 통찰력을 제공 할 것입니다.

그것은 의미 적으로 100%이며 LINQ와 거의 100%의 구문 적으로 동일하며, 추가 정렬 매개 변수를 제외하고 'Ther', '대신', '.

일부 규칙/가정 :

  • 목록 만 다루고 쿼리 제공 업체가 없습니다.
  • 게으르지 않고 열렬한 이해력.
  • 체계가 사용하지 않으므로 정적 유형이 없습니다.

내 구현은 몇 가지 핵심 절차에 따라 다릅니다.

  • 지도 - 'select'에 사용
  • 필터 - 'where'에 사용
  • 평평한 - 'selectmany'에 사용
  • 정렬 - 멀티 키 분류 절차
  • Groupby- 구성 구성을위한

나머지 구조는 모두 매크로를 사용하여 구축됩니다.

바인딩은 위생을 보장하기 위해 바운드 식별자로 태그 된 목록에 저장됩니다. 결합은 표현이 발생하는 경우로 국소 적으로 추출되고 반등됩니다.

나는 내 진보를 추적했다 블로그, 가능한 문제에 대한 통찰력을 제공 할 수 있습니다.

디자인 아이디어를 얻으려면 살펴보십시오 C 오메가, LINQ를 탄생 한 연구 프로젝트. LINQ는 귀하의 관점에 따라 C Omega의보다 실용적이거나 물을 뿌린 버전입니다.

Matt Warren의 블로그에는 모든 답변 (및 샘플 IQueryable 제공자 구현이 있습니다.

http://blogs.msdn.com/mattwar/

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top