C#_Regex_.Oftype <匹配>()

时间:2017-04-12 02:41:43

标签: c# regex

请解释一下这段代码.Oftype()。我已经在GG上搜索了2个星期,但是有一点结果。所以,我完全不明白。 我的代码:

String source = "Car2Bike6Ship6Bike3Car64Ship56"
var result = Regex
.Matches(source, "(?<name>[A-Z_[ạảàáãăắẳằặẵâấẩầậẫóỏòọõôốổồộỗơớởờợỡéèẻẹẽêếềểệễúùủụũưứừửựữíìỉịĩýỳỷỵỹđ_ẠẢÀÁÃĂẮẲẰẶẴÂẤẨẦẬẪÓỎÒỌÕÔỐỔỒỘỖƠỚỞỜỢỠÉÈẺẸẼÊẾỀỂỆỄÚÙỦỤŨƯỨỪỬỰỮÍÌỈỊĨÝỲỶỴỸĐ_a-z]+)(?<size>[0-9]+)")
.OfType<Match>()
.Select(match => new
{
    name = match.Groups["name"].Value,
    size = int.Parse(match.Groups["size"].Value),
})

.GroupBy(value => value.name)
.Select(chunk => String.Format("{0}: {1}",
   chunk.Key, String.Join(" + ", chunk.Select(item => item.size))));
        String report = String.Join(Environment.NewLine, result);

        report = report.Replace(": 0", ":");
        report = report.Replace(": +", ":");
        Console.Write(report);
        Console.ReadLine();

1 个答案:

答案 0 :(得分:2)

OfType<T>是非通用IEnumerable的扩展方法,使其成为IEnumerable<T>。在代码示例中使用它的原因是让您在match.Groups内调用Select

由于Matches方法返回实现IEnumerable的{​​{3}},而不是IEnumerable<Match> LINQ表达式需要使用Cast<T>OfType<T>来让后面的LINQ语句使用来自枚举的集合的实际类型的类型信息。