一个。获取字符串s
,转换为char
数组并循环遍历它,或
湾得到一个字符串s
,循环它的子串(s.Substring(i, 1)
)?
任何提示都非常感激。
答案 0 :(得分:12)
选项 b),循环子字符串,效率很低。
最快的方法是
c)使用只读索引器属性直接遍历字符串字符:
for (int i = 0; i < s.Length; i++) { char c = s[i]; ... }
或者,基于IEnumerable<char>
界面:
foreach(char c in s) { ... }
答案 1 :(得分:6)
(A)效率更高。但为什么不这样做:
foreach (char c in s)
一些快速基准测试表明这是一点点(<2%的差异)效率低于
for(int i = 0; i < s.Length; ++i)
char c = s[i];
但我的观点是,前者的可读性使其优于除时间最关键的代码以外的任何东西。
答案 2 :(得分:3)
这取决于你想要做什么。
您是否只需要检查特定索引处的字符,或者根据它们创建新字符串或什么?
记住SubString()
将返回一个新字符串。这可能会导致不必要的开销,具体取决于您尝试执行的操作。更清楚地解释这个问题会有所帮助。
另外,不要预先优化。以您感觉更高效的方式编写代码。然后对其进行分析并解决此问题,如果它导致瓶颈。
答案 3 :(得分:2)
用一些大的字符串来分析两个例程而不是研究和/或等待答案会更快,但是如果我不得不猜测我会下注A
答案 4 :(得分:1)
b 听起来很奇怪。只是猜测,但 a 听起来更快,当然更容易理解。
修改强> 因此,如果你想要索引,那么旧的
for (int i = 0; i < s.Length; i++)
//Do something with s[i]
会做得很好
或者,对于某些LINQ矫枉过正
s.Select((i, c) => //i being index, c the char, or the other way round, I forget at times);
答案 5 :(得分:1)
为什么要将字符串转换为char数组? String类上有一个索引器,可以让你获得单个字符:
char c = s[i];
答案 6 :(得分:0)
你正在做什么 ?当你正在执行的字符串操作有一个优化的方法时,它将超出你提出的任何类型的循环。举个简单的例子:
File.ReadAllLines(...);
...
Regex exp = new Regex(..., RegexOptions.Compiled);
foreach (line)
exp.Match(...);
比慢很多。
File.ReadAllText(...);
...
foreach (match in Regex.Match(..., RegexOptions.Multiline))
...
答案 7 :(得分:0)
虽然使用子串记住它会给你新的字符串,但是orignal字符串将保持原样。我想说orignal字符串将保持不变,因为.NET实际上是字符串,所以未来的实例会拉同样的来自实习池的不可变字符串,任何性能命中都可以忽略不计。在计算机科学中,字符串实习是一种只存储每个不同字符串值的一个副本的方法,该字符串值必须是不可变的。实习字符串使得一些字符串处理任务更加节省时间或空间,代价是在创建或实现字符串时需要更多时间。不同的值存储在字符串实习池中。每个字符串的单个副本称为“实习生”,通常由字符串类的方法查找。 因此,每次创建新字符串时都要使用子字符串 因此,不要使用子串选择for循环选项。
string str = "TestString";
for (int i = 0; i < str.Length; i++)
{
char c = str[i];
}