假设我有一个文本,我想找到每个逗号的位置。字符串是一个较短的版本,如下所示:
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);
}
是否有另一种更优化的方法?
答案 0 :(得分:10)
我在这里得到了一个扩展:
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(",");
答案 1 :(得分:7)
您可以使用Regex.Matches(string, string)方法。这将返回MatchCollection,然后您可以确定Match.Index。 MSDN有一个很好的例子,
使用System; 使用System.Text.RegularExpressions;
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
答案 2 :(得分:4)
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);
}
答案 3 :(得分:2)
您可以使用IndexOf
方法的重载,该方法也会使用起始索引来获取以下逗号,但您仍然必须在循环中执行此操作,并且它的执行方式与你有的代码。
您可以使用正则表达式查找所有逗号,但这会产生相当大的开销,因此不会比您拥有的更优化。
您可以编写LINQ查询以不同的方式执行此操作,但这也有一些开销,因此它不会比您拥有的更优化。
因此,有许多替代方法,但不是任何更优化的方式。