MatchCollection 클래스에서 Linq를 사용하는 엄청난

3143 단어 C#LINQ

소개



기본적으로는, 「Linq를 사용하고 싶지만, IEnumerable가 아니고 IEnumerable로 선언되고 있기 때문에 사용할 수 없다!」라고 하는 경우의 이야기입니다.
그리고 쿼리 구문이 아니라 메소드 구문의 이야기입니다.

소스 코드


        static void Main(string[] args)
        {
            string input = "abc123 bbb222 abc789";
            string pattern = @"(..)c(\d{3})";

            MatchCollection matches = Regex.Matches(input, pattern);

            var matches2 = matches.Cast<Match>().Select(x => x.Groups.Cast<Group>());

            foreach(var str in matches2.SelectMany(x => x))
            {
                Console.WriteLine(str);
            }
        }

출력 결과



abc123
ab
123
abc789
ab
789

해설





'MatchCollection 클래스는 그림과 같이 리스트의 리스트를 가지는 계층 구조로 되어 있습니다. 또한 MatchCollection과 GroupCollection은 IEnumerable 유형이므로이 상태에서는 Linq를 사용할 수 없습니다.
그 때문에 이하와 같은 변환을 실시합니다.

var matches2 = matches.Cast().Select(x => x.Groups.Cast());

MatchCollection 클래스는 여러 Match 클래스의 인스턴스를 가지므로 .Cast ()를 사용하여 IEnumerable에서 IEnumerable 로 변환 할 수 있습니다. 마찬가지로 x.Groups도 IEnumerable에서 IEnumerable로 변환할 수 있습니다.

 

좋은 웹페이지 즐겨찾기