2017-04-12 149 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

感謝您的支持!我會馬上嘗試。 –