.net .indexOf用于多个结果

wi3ka0sx  于 2023-01-22  发布在  .NET
关注(0)|答案(5)|浏览(130)

假设我有一个文本,我想定位每个逗号的位置,这个字符串,一个更短的版本,看起来像这样:

string s = "A lot, of text, with commas, here and,there";

理想情况下,我会使用以下内容:

int[] i = s.indexOf(',');

但由于indexOf只返回第一个逗号,我改为:

List<int> list = new List<int>();
for (int i = 0; i < s.Length; i++)
{
   if (s[i] == ',')
      list.Add(i);
}

有没有一种替代的、更优化的方法来实现这一点?

fkvaft9z

fkvaft9z1#

这里我得到了一个扩展方法,和IndexOf的用法一样:

public static IEnumerable<int> AllIndexesOf(this string str, string searchstring)
{
    int minIndex = str.IndexOf(searchstring);
    while (minIndex != -1)
    {
        yield return minIndex;
        minIndex = str.IndexOf(searchstring, minIndex + searchstring.Length);
    }
}

所以你可以用

s.AllIndexesOf(","); // 5    14    27    37

https://dotnetfiddle.net/DZdQ0L

yvt65v4c

yvt65v4c2#

你可以使用Regex.Matches(string, string)方法。这将返回一个MatchCollection,然后你可以确定Match.Index。MSDN有一个很好的例子,
使用系统;使用系统.文本.正则表达式;

public class Example
{
   public static void Main()
   {
      string pattern = @"\b\w+es\b";
      string sentence = "Who writes these notes?";

      foreach (Match match in Regex.Matches(sentence, pattern))
         Console.WriteLine("Found '{0}' at position {1}", 
                           match.Value, match.Index);
   }
}
// The example displays the following output:
//       Found 'writes' at position 4
//       Found 'notes' at position 17
46qrfjad

46qrfjad3#

IndexOf also allows you to add another parameter for where to start looking。可以将该参数设置为最后一个已知逗号位置+1。例如:

string s = "A lot, of text, with commas, here and, there";
int loc = s.IndexOf(',');
while (loc != -1) {
    Console.WriteLine(loc);
    loc = s.IndexOf(',', loc + 1);
}
jrcvhitl

jrcvhitl4#

你可以使用IndexOf方法的重载,它也接受一个起始索引来获取下面的逗号,但是你仍然需要在一个循环中完成,它的执行方式和你的代码几乎一样。
您可以使用正则表达式来查找所有逗号,但这会产生相当大的开销,因此并不比您现有的方法更优化。
您可以编写一个LINQ查询来以不同的方式执行此操作,但这也会产生一些开销,因此它不会比您现有的查询更优化。
因此,有许多可供选择的方法,但没有任何一种方法是更优化的。

3duebb1j

3duebb1j5#

这有点奇怪,但是为什么不使用split呢?可能比遍历整个字符串更容易

string longString = "Some, string, with, commas.";
string[] splitString = longString.Split(",");
int numSplits = splitString.Length - 1;
Debug.Log("number of commas "+numSplits);
Debug.Log("first comma index = "+GetIndex(splitString, 0)+" second comma index = "+GetIndex(splitString, 1));

public int GetIndex(string[] stringArray, int num)
{
    int charIndex = 0;
    for (int n = num; n >= 0; n--)
    {
        charIndex+=stringArray[n].Length;
    }
    return charIndex + num;
}

相关问题