GetEnumerator()在字符串的中间
本文关键字:中间 字符串 GetEnumerator | 更新日期: 2023-09-27 18:04:39
假设我有一个非常长的字符串,并且希望获得一个从字符串中间开始的枚举数(对于LINQ的好处),在给定的索引处。也就是说,
var longString = GetLongString();
var index = 99999;
// seems unnecessarily expensive to allocate a new string
var enumerator = longString.Substring(9999).GetEnumerator();
// Use LINQ.
enumerator.TakeWhile( /* ... */ );
是否有更好(即:更便宜/更快)的方法来做这件事?
考虑Enumerable.Skip
:
longString.Skip(9999).TakeWhile( /* ... */ );
然而,请记住,正如Michael Liu所写的,Skip
以迭代的方式工作(严格地说,它取决于实现,但至少这是你通常拥有的,参见例如。net Framework 4.6参考源)。如果它导致可测量的1慢,请查看Michael的扩展方法。
- D。Knuth:"过早优化是万恶之源"
使用longString.Skip(n)
,如AlexD的回答,将使n调用底层枚举器的MoveNext方法跳过所有您不关心的字符。对于较大的n,可以通过编写自定义迭代器方法来提高性能:
public static IEnumerable<char> EnumerableSubstring(this string s, int startIndex)
{
for (; startIndex < s.Length; startIndex++)
yield return s[startIndex];
}
示例用法:longString.EnumerableSubstring(9999).TakeWhile( /* ... */ )