MatchCollection에서 LINQ 확장 메서드 구문 사용


92

다음 코드가 있습니다.

MatchCollection matches = myRegEx.Matches(content);

bool result = (from Match m in matches
               where m.Groups["name"].Value.Length > 128
               select m).Any();

LINQ 확장 메서드 구문을 사용하여이 작업을 수행 할 수 있습니까?

이 같은:

bool result = matches.Any(x => ... );

답변:


192
using System.Linq;

matches.Cast<Match>().Any(x => x.Groups["name"].Value.Length > 128)

당신은 단지에서 변환해야 IEnumerableIEnumerable<Match><T>를 IEnumerable에서 제공하는 LINQ 확장에 액세스하려면 (는 IEnumerable <T>).


여기에있는 모든 답변에 누가 반대표를 던지고 있습니까? 이 대답은 내 찬성 투표를 얻습니다.
Kevin Kalitowski 2011 년

+1 왜 이것이 반대표를 받았는지 알아 내려고합니다. 나는 그것을 보지 않는다.
jason

나는 이것이 정확하기 때문에 투표가 어떻게 내려 졌는지에 대해 정말로 혼란 스럽습니다
msarchet

1
이것은 작동합니다. using System.Linq그렇지 않으면 구문 오류가 발생 하는지 확인하십시오
Ash Berlin-Taylor

1
혼란스러워하는 분들에게 감사합니다. CastC # 8.0부터는 필요하지 않지만 코드가 제공되지 않으면 이전 언어 버전에서 컴파일되지 않습니다.
rvnlord

46

명시 적 범위 변수 유형 을 지정 하면 컴파일러는에 대한 호출을 삽입합니다 Cast<T>. 그래서 이거:

bool result = (from Match m in matches
               where m.Groups["name"].Value.Length > 128
               select m).Any();

다음과 정확히 동일합니다.

bool result = matches.Cast<Match>()
                     .Where(m => m.Groups["name"].Value.Length > 128)
                     .Any();

다음과 같이 작성할 수도 있습니다.

bool result = matches.Cast<Match>()
                     .Any(m => m.Groups["name"].Value.Length > 128);

이 경우에 Cast호출하기 때문에 필요한 MatchCollection경우에만 구현 ICollection하고 IEnumerable,하지 IEnumerable<T>. 거의 모든 개체 확장 방법에 LINQ를 대상으로 IEnumerable<T>주목할만한의 예외를 제외 Cast하고 OfType「약 "입력 모음 (예 : 변환하는 데 사용되는 둘, MatchCollection일반에) IEnumerable<T>다음 더 LINQ 작업을 가능하게한다 -.



8

이 시도:

var matches = myRegEx.Matches(content).Cast<Match>();

참고로 다음을 참조하십시오 Enumerable.Cast.

의 요소를 IEnumerable지정된 형식으로 변환합니다 .

기본적으로는 회전하는 한 가지 방법이다 IEnumerable으로는 IEnumerable<T>.


+1 왜 이것이 반대표를 받았는지 알아 내려고합니다. 나는 그것을 보지 않는다.
jason

@Jason : 아마도 누군가가 답을 높이려고했을 것입니다.
Andrew Hare 2011 년

3

나는 그것이 다음과 같을 것이라고 생각합니다.

bool result = matches.Cast<Match>().Any(m => m.Groups["name"].Value.Length > 128);

1
제 요점은입니다 MatchCollection만 구현 IEnumerable. 강력한 형식이 아닙니다.
jason

2

다음과 같이 시도 할 수 있습니다.

List<Match> matchList = matches.Cast<Match>().Where(m => m.Groups["name"].Value.Length > 128).ToList();

-1

편집하다:

 public static IEnumerable<T> AsEnumerable<T>(this IEnumerable enumerable)
 {
      foreach(object item in enumerable)
          yield return (T)item;
 }

그런 다음이 확장 메서드를 호출하여 IEnumerable로 변환 할 수 있어야합니다.

 matches.AsEnumerable<Match>().Any(x => x.Groups["name"].Value.Length > 128);

이것은 내 것보다 낫습니다. Any가 술어를 취했다는 것을 기억하지 못했습니다.
pstrjds

제 요점은입니다 MatchCollection만 구현 IEnumerable. 강력한 형식이 아닙니다.
jason 2011 년

@Jason은 IEnumberable.Cast <T>를 통해 IEnumberable <T>로 캐스팅 할 수 있다는 점을 제외하고
msarchet

@msarchet : 예, 압니다. 그래서 제가 귀하의 답변을 찬성했습니다. 이 답변은 편집하기 전에 컴파일되지 않았을 것입니다.
jason
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.