请解释一下这段代码.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();
答案 0 :(得分:2)
OfType<T>
是非通用IEnumerable
的扩展方法,使其成为IEnumerable<T>
。在代码示例中使用它的原因是让您在match.Groups
内调用Select
。
由于Matches
方法返回实现IEnumerable
的{{3}},而不是IEnumerable<Match>
LINQ表达式需要使用Cast<T>
或OfType<T>
来让后面的LINQ语句使用来自枚举的集合的实际类型的类型信息。