2009-07-08 5 views
10

MatchCollection 개체에 대해 LINQ 쿼리를 실행하려고했지만 ICollection<T> (단지 ICollection)을 구현하지 않았으므로 불가능했습니다.일반 ICollection을 구현하는 클래스에서 LINQ 사용

코드 제너릭뿐만 아니라 성능 및 메모리 사용과 관련하여 LINQ를 비 제너릭 컬렉션과 함께 사용하는 가장 좋은 방법은 무엇입니까?

은 (관심, 여기에 비 LINQuified 코드 :)를 IEnumerable을 반환합니다 Cast 확장 방법을 사용하는

MatchCollection fieldValues = Regex.Matches(fieldValue, @"(?<id>\d+);#(?<text>[^;|^$]+)"); 
foreach (Match m in fieldValues) 
{ 
    if (m.Groups["text"].Value.Equals(someString)) 
    { 
     // Do stuff 
    } 
} 

답변

10

someString 필터를 LINQ와 함께 포함 할 수 있습니다. 그래서 유형 모두 포함 컴파일러는이 같은 쿼리를 변환하는 것이

var matches = Regex.Matches(fieldValue, @"(?<id>\d+);#(?<text>[^;|^$]+)"); 
var textMatches = from Match m in matches 
        where m.Groups["text"].Value.Equals(someString) 
        select m; 

foreach (Match m in textMatches) 
{ 
    // Do stuff 
} 

주 ...이에

var q = from MyType x in myEnum select x; 

...

...

var q = from x in myEnum.Cast<MyType>() select x; 

... Cast<T>()은 중복됩니다.

성능 측면에서 보면 Cast<T>()은 명시 적 형식 캐스팅 만 수행하고 값을 산출하므로 성능 적중률은 무시할 수 있습니다. 모든 회원이 원하는 유형인지 확실하지 않은 기존 컬렉션의 경우 OfType<T>()을 대신 사용할 수 있습니다.

+0

MatchCollection이 일반적인 것이 아니기 때문에 어떤 이유로 나는 이것이 작동하지 않을 것이라고 생각했습니다. 내가 그걸 시도 했어야했는데! 컴파일러 번역에 대한 귀하의 설명은 매우 유용했습니다. –

3

시도이다.

IEnumerable<Match> query = from Match m in fieldValues.Cast<Match>() 
          select m; 

그리고 캐스트 메서드를 사용하지 않으면 컴파일러에서 "쿼리"의 형식을 IEnumerable로 유추합니다.

var query = from Match v in fieldValues 
         select v;