问:
我希望根据-
等符号来获取子字符串。
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
进行子串,并且不会对性能代码造成严重影响?
答案 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的性能例如,如果您有一些需要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];
...访问相应的部分。