2015-10-17 55 views
3

我有string小号C#中可能在特定索引处启动迭代器吗?

string [] cargs 

箭头,我想遍历它在k个指标开始。是否有替代

var iter = cargs.GetEnumerator(); 
for (int i = 0; i <= k; ++i) iter.MoveNext(); 

???

此外,我试图找出什么类型的iter是在上面的代码片段。当我在它悬停在Visual Studio中,有人告诉我是System.Collections.IEnumerator型的,但我行更改为

IEnumerator iter = cargs.GetEnumerator(); 

VS告诉我Using the generic System.Collections.Generic.IEnumerator<T> requires 1 type arguments。然后我试着

IEnumerator<string> iter = cargs.GetEnumerator(); 

IEnumerator<string[]> iter = cargs.GetEnumerator(); 

所以...什么类型cargs.GetEnumerator(),真的吗?

+5

'cargs.Skip(5)' – DavidG

+0

此外,点击'GetEnumerator'代码,然后按F12,它会跳转到'System.Collections.IEnumerator' – DavidG

+0

简短的回答没有”。 'IEnumerator'' IEnumerator接口不提供跳过值的方法。你必须使用'.Skip(5)'这样的东西来提供你正在跳过价值的错觉。 – Enigmativity

回答

9

不要手动迭代,除非您正在编写自定义枚举方法,该方法将从使用手动迭代实现中受益。代替

优选foreach或现有枚举方法(如LINQ)。


可以通过使用Skip(int)扩展方法在阵列上在任何索引开始(或者任何其它IEnumerable<T>,尽管在某些序列中的术语索引是不适用)。


每个IEnumerable<T>具有GetEnumerator()方法,它返回一个IEnumerator<T>

然而,每一个IEnumerable<T>也是(非通用)IEnumerable,其具有GetEnumerator()方法,它返回一个(非通用)IEnumerator

更喜欢通用接口,因为非通用接口大多是遗留的(从类型系统不支持泛型类型的早期版本开始)。

0

只是一个供参考

//This starts at 0 
var k = 31; 
var startAT = 0; 
for (int i= startAT; i<= k; ++i) 
{ 
    Console.WriteLine(i); 
} 

------------------------------- 

//here the start position is changed, you can change to what you like! 
//this starts at 30 instead of 0 
var k = 31; 
var startAT = 30; 
for (int i= startAT; i<= k; ++i) 
{ 
    Console.WriteLine(i); 
}