2017-04-12 147 views
1

请向我解释此代码.Oftype()。我已经搜索了GG两周,但有一点结果。所以,我完全不明白。 我的代码:C#_Regex_.Oftype <match>()

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

回答

2

OfType<T>是不通用IEnumerable扩展方法,这使得它变成一个IEnumerable<T>。在您的代码示例中使用它的原因是让您在Select内调用match.Groups

由于Matches方法返回MatchCollection,它实现IEnumerable,不IEnumerable<Match> LINQ表达式需要使用一个Cast<T>OfType<T>让随后利用来自实际类型的集合类型的信息被枚举LINQ语句。

+0

感谢您的支持!我会马上尝试。 –