2011-08-31 3 views
7

Linq의 쿼리 키워드 (예 : select, where 등)를 자체 정의로 확장 할 수 있습니까?C#/LINQ에서 Query-Keywords를 확장 할 수 있습니까?

Codeexample는 명확하게하기 :

System.Collections.Generic.List<string> aList = 
    new System.Collections.Generic.List<string> { "aa", "ab", "ba", "bb" }; 

// instead of 
string firstString = (from item in aList 
         where item.StartsWith("a") 
         select item).First(); 

// would be nice 
string firstString = from item in aList 
        where item.StartsWith("a") 
        selectFirst item; 

// or something else 
from item in aList 
where item.StartsWith("a") 
WriteLineToConsole item; 

을 나는 그것이 가능하지만, 여전히 기대하지 생각)이 사용자 정의 변환하는 전처리를 작성하는 것입니다 달성하기

+0

특별한 이유가 무엇입니까? – AakashM

+0

세 명의 400K + 사용자가 귀하의 질문에 답변했습니다. 가서 염소를 잡아라! – dotNET

답변

6

한 가지 방법을 LINQ 키워드를 표준 LINQ 키워드로 변환 한 다음 컴파일러에 제공하십시오. 그건 그렇고 표준 LINQ 키워드와 함께 작동하는 방법입니다. 프리 프로세서는이를 일반 확장 메서드 (.Select, .Where, .GroupBy, ...)로 변환 한 다음 해당 키워드를 이해하지 못하는 컴파일러에 제공합니다.

물론 이렇게하면 Intellisense가 손실되지만 Visual Studio 확장을 작성하면 해결할 수 있습니다. 이 설탕에도 불구하고 꽤 많은 일이있을 수 있습니다.

+1

이 확장 기능에 대한 시작점을 제공 할 수 있습니까? – Matthias

+0

아주 오래된 질문이지만 맞춤 키워드에 대해 어떤 조치를 취했습니까? –

4

아니요, 언어 사양 또는 현재의 C# 컴파일러에서 사용할 수 없습니다. 거기서 만드는 모든 것은 더 이상 (순수한) C#이 아닙니다.

6

자신 만의 문맥 키워드를 추가 할 수는 없지만 수는이 기존 단어의 의미에 영향을 미칩니다. 예를 들어

,이 코드 :

string firstString = (from item in aList 
         where item.StartsWith("a") 
         select item).First(); 

효율적으로 전처리 : 당신은 그 WhereFirst 메서드 호출의 의미를 변경, 그래서 만약 ...

string firstString = aList.Where(item => item.StartsWith("a")) 
          .First(); 

, 당신은 행동에 영향을 미칠 수 .

위장이라면 얼마 전에 this Stack Overflow answer을보고 싶을 수도 있습니다. 특정 상황에서 LINQ에서의 동작이 where으로 변경되는 경우가 있습니다. 그것은 사악하고 악한 코드입니다.

관련 문제