GetEnumerator()位于字符串

时间:2015-07-25 00:21:28

标签: c# linq

假设我有一个非常长的字符串,并希望获得一个枚举器(对于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( /* ... */ );

有更好的方法(即:更便宜/更快)吗?

2 个答案:

答案 0 :(得分:9)

考虑Enumerable.Skip

longString.Skip(9999).TakeWhile( /* ... */ );

但是,请记住,正如Michael Liu所写,Skip以迭代的方式工作(严格来说,它取决于实现,但至少这是你通常拥有的,请参阅例如{{3} })。如果它导致可测量的 1 慢,请查看Michael的扩展方法。

  1. .NET Framework 4.6 Reference Sources:“过早优化是万恶之源

答案 1 :(得分:5)

使用longString.Skip(n),与AlexD's answer一样,将对基础枚举器的MoveNext方法进行 n 调用,以跳过您不喜欢的所有字符。关心。对于 n 的大值,可以通过编写自定义迭代器方法来提高性能:

public static IEnumerable<char> EnumerableSubstring(this string s, int startIndex)
{
    for (; startIndex < s.Length; startIndex++)
        yield return s[startIndex];
}

样本用法:

longString.EnumerableSubstring(9999).TakeWhile( /* ... */ )