不要通过循环每个字符来确定它是否是你想要的那个,然后将其索引添加到列表中,如下所示:
var foundIndexes = new List<int>();
for (int i = 0; i < myStr.Length; i++)
{
if (myStr[i] == 'a')
foundIndexes.Add(i);
}
不要通过循环每个字符来确定它是否是你想要的那个,然后将其索引添加到列表中,如下所示:
var foundIndexes = new List<int>();
for (int i = 0; i < myStr.Length; i++)
{
if (myStr[i] == 'a')
foundIndexes.Add(i);
}
String.IndexOf
,请参考下面的示例: string s = "abcabcabcabcabc";
var foundIndexes = new List<int>();
long t1 = DateTime.Now.Ticks;
for (int i = s.IndexOf('a'); i > -1; i = s.IndexOf('a', i + 1))
{
// for loop end when i=-1 ('a' not found)
foundIndexes.Add(i);
}
long t2 = DateTime.Now.Ticks - t1; // read this value to see the run time
for
是否总是会删除在IndexOf中不存在的边界检查,但对于稀有字符的长字符串可能会更快。 - Alexei LevenkovStopWatch
而不是在“基准测试”方面减去滴答声。 - Gonzo345我使用以下扩展方法来yield
所有结果:
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);
}
}
用法:
IEnumerable<int> result = "foobar".AllIndexesOf("o"); // [1,2]
边缘情况的注意事项:这是一种适用于一个或多个字符的字符串方法。在"fooo".AllIndexesOf("oo")
的情况下,结果只是1
https://dotnetfiddle.net/CPC7D2
+ searchstring.Length
的位置上使用+ 1
可能更正确。考虑一下AllIndexesOf("11111", "11")
的例子。它返回(0, 2)
,因为它从原始索引0处的11
末尾开始搜索,然后从索引2开始搜索。实际答案应该是(0, 1, 2, 3)
,因为可以从所有这些索引中找到11
。这是我对你的.NET Fiddle的分支,演示了更新后的代码,可以生成“正确”的答案,具体取决于你的世界观:https://dotnetfiddle.net/RGQWd8。 - Aaron Newton怎么样?
string xx = "The quick brown fox jumps over the lazy dog";
char search = 'f';
var result = xx.Select((b, i) => b.Equals(search) ? i : -1).Where(i => i != -1);
直接使用原始迭代方式,这是最优化的方法。除非任务比较复杂,你不需要寻找更好的优化解决方案...
因此我建议继续使用:
var foundIndexes = new List<int>();
for (int i = 0; i < myStr.Length; i++)
if (myStr[i] == 'a') foundIndexes.Add(i);
public static List<int> GetSubstringLocations(string text, string searchsequence)
{
try
{
List<int> foundIndexes = new List<int> { };
int i = 0;
while (i < text.Length)
{
int cindex = text.IndexOf(searchsequence, i);
if (cindex >= 0)
{
foundIndexes.Add(cindex);
i = cindex;
}
i++;
}
return foundIndexes;
}
catch (Exception ex) { }
return new List<int> { };
}
public static String[] Split(this string s,char c = '\t')
{
if (s == null) return null;
var a = new List<int>();
int i = s.IndexOf(c);
if (i < 0) return new string[] { s };
a.Add(i);
for (i = i+1; i < s.Length; i++) if (s[i] == c) a.Add(i);
var result = new string[a.Count +1];
int startIndex = 0;
result[0] = s.Remove(a[0]);
for(i=0;i<a.Count-1;i++)
{
result[i + 1] = s.Substring(a[i] + 1, a[i + 1] - a[i] - 1);
}
result[a.Count] = s.Substring(a[a.Count - 1] + 1);
return result;
}
public static int[] IndexOfAll(this string source, char target)
{
return source.Select((c, idx) => c == target ? idx : -1).Where(idx => idx != -1).ToArray();
}
使用方法:
var result = "foobar".IndexOfAll('o'); // [1,2]