c # получить позицию итератора в словаре - PullRequest
3 голосов
/ 08 августа 2011

У меня есть Dictionary<string,string>, и я перебираю его KeyValuePairs. Но моя проблема в том, что мне нужно остановить итерацию в какой-то момент и продолжить итерацию с той же позиции. Мой код выглядит следующим образом.

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

Код не очень понятен, но я надеюсь, что я пытаюсь сделать это. Что я делаю?

Ответы [ 4 ]

2 голосов
/ 08 августа 2011

Попробуйте 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: если производительность имеет значение, это не будет лучшим решением

2 голосов
/ 08 августа 2011

Вы можете отказаться от 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 голос
/ 08 августа 2011

Изучите термин доходность

http://msdn.microsoft.com/en-us/library/9k7k7cf0%28v=vs.80%29.aspx

0 голосов
/ 08 августа 2011

Переключите цикл foreach на for и объявите индекс цикла вне циклов, например:

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;
     }
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...