MatchCollectionクラスでLinqを使うおまじない
はじめに
基本的には、「Linqを使いたいけど、IEnumerable<T>じゃなくて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
解説
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<Match>().Select(x => x.Groups.Cast<Group>());
MatchCollectionクラスは複数のMatchクラスのインスタンスを持つため.Cast<Match>()を用いることにより、IEnumerableからIEnumerable<T>に変換できます。 同様にx.GroupsもIEnumerableからIEnumerable<T>に変換できます。
Author And Source
この問題について(MatchCollectionクラスでLinqを使うおまじない), 我々は、より多くの情報をここで見つけました https://qiita.com/tokishirazu/items/74f49bba971ad5fa1dcb著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .