2011-08-08 56 views
3

我有一個Dictionary<string,string>,我遍歷它的KeyValuePair。但我的問題是,我需要停止迭代,並繼續從同一位置進行迭代。我的代碼如下。c#獲得詞典中的迭代器位置

for(i = 0; i<5; i++) 
{ 
    foreach(var pair in dictionary) /* continue from iterators last position */ 
    { 
      /* do something */ 
      if(consdition) break; 
    } 
} 

該代碼不是很清楚,但我希望我的想要做的是。我該怎麼辦?

回答

2

您可以放棄foreach並直接在IEnumerator<T>上工作。

using (IEnumerator<<KeyValuePair<K,V>> enumerator = dict.GetEnumerator()) 
{ 
    while (enumerator.MoveNext()) 
    { 
     DoSomething(enumerator.Current); 
     if (condition) 
      break; 
    } 

    while (enumerator.MoveNext()) 
    { 
     DoMoreWork(enumerator.Current); 
    } 
} 

但是,你可能會考慮重構代碼,以便foreach是外環。這可能更簡單,更清潔。

int i=0; 
foreach(var pair in dictionary) 
{ 
     if(condition) 
     { 
     DoSomething(); 
     i++; 
     if(i<5) 
      continue; 
     else 
      break; 
     } 
} 
+1

恐怕這是迄今唯一有用的建議。 – Gabe

+0

用'使用'塊包裝它,以便它是異常安全的。希望你不介意。 – LukeH

+0

「使用」的問題是它需要在第一次迭代的同一個塊/方法中進行延續。在我的例子中就是這種情況,但不知道OPs代碼是否如此。 – CodesInChaos

0

切換foreachfor環和申報循環的指數環以外的,如:

int pairIndex = 0; 
for(i = 0; i<5; i++) 
{ 
    for (; pairIndex < dictionary.Count; pairIndex++) 
    { 
      KeyValuePair<string, string> pair = dictionary.ElementAt(pairIndex); 
      /* do something */ 
      if(consdition) break; 
    } 
} 
+2

這是'爲O(n^2)' – CodesInChaos

+0

@Anonymous Downvoter:所述'爲O(n^2)'是在那是代碼由OP'發佈我需要在某個點停止迭代並繼續從同一位置進行迭代。我的代碼如下:'....這個答案只是回答他的問題,取決於代碼 –

+0

'for'循環是'O(n)'而'ElementAt'是'O(n)',所以嵌套他們產生'O(n^2)'。由於OP只有外部循環,原來的解決方案是'O(n)'。 – Gabe

2

試用LINQ的條件找項目索引:

int index = dictionary.TakeWhile(condition).Count(); 

如果可以的話將你的情況提取到一個Func中,你可以在SkipWhile()中重用它:

Func<int, bool> condition = (key) => { return key == "textToSearch"; }; 
int index = dictionary.TakeWhile(item => condition(item.Key)).Count(); 

// use inverted condition 
var secondPart = dictionary.SkipWhile(item => !condition(item.Key)); 

PS:如果性能很重要,它不會是最好的解決方案

+0

「...並繼續從同一位置進行迭代」。您的解決方案當然適用於停止。 =) –

+0

@J。 Steen:是的,正如我所說的「按條件查找項目索引」。我會考慮稍後發佈我的解決方案 – sll

+0

嗯。是的,我現在看到了。不是很明顯,因爲我被整個TakeWhile分散注意力重新集合... =) –