[c#] MatchCollection에서 LINQ 확장 메서드 구문 사용

다음 코드가 있습니다.

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 => ... );



답변

using System.Linq;

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

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


답변

명시 적 범위 변수 유형 을 지정 하면 컴파일러는에 대한 호출을 삽입합니다 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 작업을 가능하게한다 -.


답변

이 시도:

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

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

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

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


답변

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

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


답변

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

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


답변

편집하다:

 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);


답변