首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将MatchCollection转换为字符串数组

将MatchCollection转换为字符串数组
EN

Stack Overflow用户
提问于 2012-07-10 23:00:36
回答 6查看 68.5K关注 0票数 89

有比这更好的方法将MatchCollection转换为字符串数组吗?

代码语言:javascript
运行
复制
MatchCollection mc = Regex.Matches(strText, @"\b[A-Za-z-']+\b");
string[] strArray = new string[mc.Count];
for (int i = 0; i < mc.Count;i++ )
{
    strArray[i] = mc[i].Groups[0].Value;
}

附言:mc.CopyTo(strArray,0)抛出一个异常:

源数组中至少有一个元素无法转换为目标数组类型。

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2012-07-10 23:02:42

尝试:

代码语言:javascript
运行
复制
var arr = Regex.Matches(strText, @"\b[A-Za-z-']+\b")
    .Cast<Match>()
    .Select(m => m.Value)
    .ToArray();
票数 184
EN

Stack Overflow用户

发布于 2012-07-10 23:28:19

Dave Bish的回答很好,而且工作正常。

值得注意的是,用OfType<Match>()替换Cast<Match>()会加快速度。

代码会变成:

代码语言:javascript
运行
复制
var arr = Regex.Matches(strText, @"\b[A-Za-z-']+\b")
    .OfType<Match>()
    .Select(m => m.Groups[0].Value)
    .ToArray();

结果是完全相同的(并且以完全相同的方式解决了OP的问题),但是对于大型字符串,它的速度更快。

测试代码:

代码语言:javascript
运行
复制
// put it in a console application
static void Test()
{
    Stopwatch sw = new Stopwatch();
    StringBuilder sb = new StringBuilder();
    string strText = "this will become a very long string after my code has done appending it to the stringbuilder ";

    Enumerable.Range(1, 100000).ToList().ForEach(i => sb.Append(strText));
    strText = sb.ToString();

    sw.Start();
    var arr = Regex.Matches(strText, @"\b[A-Za-z-']+\b")
              .OfType<Match>()
              .Select(m => m.Groups[0].Value)
              .ToArray();
    sw.Stop();

    Console.WriteLine("OfType: " + sw.ElapsedMilliseconds.ToString());
    sw.Reset();

    sw.Start();
    var arr2 = Regex.Matches(strText, @"\b[A-Za-z-']+\b")
              .Cast<Match>()
              .Select(m => m.Groups[0].Value)
              .ToArray();
    sw.Stop();
    Console.WriteLine("Cast: " + sw.ElapsedMilliseconds.ToString());
}

输出如下:

代码语言:javascript
运行
复制
OfType: 6540
Cast: 8743

因此,对于非常长的字符串,Cast()会更慢。

票数 32
EN

Stack Overflow用户

发布于 2014-05-14 21:55:45

我运行了与Alex发布的完全相同的基准测试,发现有时Cast更快,有时OfType更快,但两者之间的差异可以忽略不计。然而,尽管for循环很难看,但它始终比其他两个循环都快。

代码语言:javascript
运行
复制
Stopwatch sw = new Stopwatch();
StringBuilder sb = new StringBuilder();
string strText = "this will become a very long string after my code has done appending it to the stringbuilder ";
Enumerable.Range(1, 100000).ToList().ForEach(i => sb.Append(strText));
strText = sb.ToString();

//First two benchmarks

sw.Start();
MatchCollection mc = Regex.Matches(strText, @"\b[A-Za-z-']+\b");
var matches = new string[mc.Count];
for (int i = 0; i < matches.Length; i++)
{
    matches[i] = mc[i].ToString();
}
sw.Stop();

结果:

代码语言:javascript
运行
复制
OfType: 3462
Cast: 3499
For: 2650
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11416191

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档