【发布时间】:2012-07-11 10:23:30
【问题描述】:
回答以下问题: How to convert MatchCollection to string array
给定两个 Linq 表达式:
var arr = Regex.Matches(strText, @"\b[A-Za-z-']+\b")
.OfType<Match>() //OfType
.Select(m => m.Groups[0].Value)
.ToArray();
和
var arr = Regex.Matches(strText, @"\b[A-Za-z-']+\b")
.Cast<Match>() //Cast
.Select(m => m.Groups[0].Value)
.ToArray();
OfType 被用户 Alex 基准测试为稍微快一些(并由我本人确认)。
这对我来说似乎违反直觉,因为我认为 OfType 必须同时进行“是”比较,和强制转换 (T)。
任何关于为什么会这样的启示将不胜感激:)
【问题讨论】:
-
我不认为这是重复的,因为问题不是 什么 有区别,而是为什么一个比另一个慢。
-
@danbystrom 在an answer 中,您链接到Ash 的问题解释了
OfType的速度较慢。 OP 询问为什么当序列的所有元素实际上都是这种类型时它实际上更快。 -
当它可以只使用
as和空检查时,为什么它会做is然后进行强制转换? -
这不是重复的。
-
你的答案就在这里Cast and OfType :yes Jon Skeet