根据某种符号的子字符串

本文关键字:字符串 符号 | 更新日期: 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];

以访问各个部件。