根据某种符号的子字符串
本文关键字:字符串 符号 | 更新日期: 2023-09-27 17:59:41
Q:
我想根据一些符号得到子字符串,比如-
。
例如:
如果我有这样的字符串:
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
进行子串,并且不会对性能代码产生严重影响?
拆分字符串是O(N)
,不多也不少,这就是String.Split
的实际复杂性。因此,即使您编写自己的过程,它也不可能更快。也许它可以稍微快一点。在任何情况下,首先要确保String.Split
的性能确实不满足您的要求。
是的,如果在LOOP中一次又一次地进行拆分,那么这将是一个性能问题。您必须首先对其进行拆分,然后对数组进行迭代-请参阅其他答案
首先,您应该只执行一次Split操作。即,代替
some loop {
...
string substring = name.Split('-')[i];
...
}
使用
string[] substrings = name.Split('-');
some loop {
...
string substring = substrings[i];
...
}
第二,不要担心Strint的性能。除非,否则拆分太多
- 你有一个真实的、可衡量的绩效问题
- 你知道斯廷斯普利特是罪魁祸首
例如,如果某个数据库操作耗时1秒,那么后续的"拆分"操作耗时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
}
}
拆分的问题在于它是否被过度使用。如果需要在一个字符上拆分字符串,请拆分该字符串。Regex是第二种最常用的方式,但它有自己的一套或性能陷阱。如果你真的需要保持你的足迹很小,扫描字符串并进行适当的处理是你的最佳选择,然而这也充满了危险,因为.net字符串是不可变的,你很可能会像使用split时遇到的问题一样运行它。所以我想它的长短就是使用拆分,如果这不能满足你的需求,就重新评估。
我认为这取决于您的数据。然而,你不应该重复做。。。
string substring = name.Split('-')[i];
因为每次只需要访问其中一个部分时,这会将字符串拆分为多个部分。相反,像这样缓存拆分结果。。。
string[] parts = name.Split('-');
然后使用。。。
string substring = parts[i];
以访问各个部件。