子字符串根据某些符号

时间:2011-06-21 11:58:33

标签: c# asp.net performance string substring

问:

我希望根据-等符号来获取子字符串。

EX:

如果我有这样的字符串:

saturday-sa-0-

我想得到:

saturday

sa

0

我搜索并找到以下方法:

string substring = name.Split('-')[i];

我的代码块示例:

foreach (string name in q)
                {
                    for (int i = 0; i < 3; i++)
                    {
                        string substring = name.Split('-')[i];
                    }
                }

但是当我有一个长字符串时,我阅读了关于性能缺陷的评论.. 我的问题是:有没有办法根据具体的sign进行子串,并且不会对性能代码造成严重影响?

4 个答案:

答案 0 :(得分:3)

分割字符串是O(N),不多也不少,这是String.Split的实际复杂性所以即使你编写自己的程序,它也不会真的更快。也许它可以稍快一些。无论如何,首先要确保String.Split的表现确实对你不满意。

是的,如果你在LOOP中一遍又一遍地分裂,那么这将是一个性能问题。您必须首先拆分它然后迭代数组 - 请参阅其他答案

答案 1 :(得分:2)

首先,您应该只执行一次拆分操作。即,而不是

some loop {
    ...
    string substring = name.Split('-')[i];
    ...
}

使用

string[] substrings = name.Split('-');
some loop {
    ...
    string substring = substrings[i];
    ...
}

其次,除非

,否则不要太担心Strint.Split的性能
  • 你有一个真实的,可测量的性能问题和
  • 你知道String.Split是罪魁祸首。

例如,如果您有一些需要1秒的数据库操作,那么后续的Split操作需要0.001或0.002秒并不重要。


编辑:关于评论中的代码:您可以重构

foreach (string name in q) {
    for (int i = 0; i < 3; i++) {
       string substring = name.Split('-')[i]; 
       // do something with substring
    }
}

foreach (string name in q) {
    string[] substrings = name.Split('-'); 
    for (int i = 0; i < 3; i++) {
       string substring = substrings[i]; 
       // do something with substring
    }
}

答案 2 :(得分:2)

拆分问题是否过度使用。如果需要在字符上拆分字符串,则拆分字符串。正则表达式是下一个最常用的方式,但它有自己的设置或性能陷阱。如果你真的需要保持脚印小扫描字符串并进行处理是你最好的选择,但是这也充满了危险,因为.net字符串是不可变的你可能会遇到你遇到的相同问题与分裂。所以我想它的长期和短期是使用拆分,如果这不符合你的需要重新评估。

答案 3 :(得分:1)

我说这取决于你的数据。但是,你不应该反复做...

string substring = name.Split('-')[i];

...因为每次你只需要访问其中一个部分时,这会将你的字符串分成几部分。相反,像这样缓存拆分结果......

string[] parts = name.Split('-');

...然后使用......

string substring = parts[i];

...访问相应的部分。