Внутренний цикл foreach не продолжается со второго элемента на второй итерации - PullRequest
0 голосов
/ 03 июня 2019

Я использовал разрыв внутри внутреннего цикла foreach и продолжил внешний цикл, но когда дело доходит до внутреннего цикла foreach, он начинается с первого элемента, а не со второго. Нужна ваша помощь.

foreach (var item in list1)
{
    bool flag = false;
    foreach (var item in list2)
    {
        item.category = item.category;
        item.text = item.text;
        item.key = item.key;

        db.Entry(item).State = EntityState.Modified;
        db.SaveChanges();
        flag = true;
        break;
    }
    if(flag) continue;
}

Ответы [ 2 ]

2 голосов
/ 03 июня 2019

Это именно то, что должно произойти, если вы выйдете из цикла foreach и нажмете его еще раз.
Если вы хотите продолжить со второй, третьей или n-й позиции, просто не выходите из циклалибо используйте continue;.Позвольте мне привести вам пример:

// This is a List of Lists of ints we'll iterate over
var outerList = new List<int> {1, 2, 3, 4, 5};
var innerList = new List<int> {1, 2, 3, 4, 5};

foreach(var outerItem in outerList)
{
    // This will print '1, 2, 3, 4, 5' over the course of execution (as expected)
    Console.WriteLine($"outerList item: {outerItem}");
    foreach (var innerItem in innerList)
    {
        // This will always print '1', never something else (as expected)*
        Console.WriteLine($"innerList item: {innerItem}");
        break;
    }
}

* Это потому, что foreach никогда не может перейти ко второй записи innerList, поэтому он просто печатает первую запись 5 (или сколько угодно элементов).в outerList) раз.Весь вывод будет выглядеть так (без # ...)

outerList item: 1
innerList item: 1
outerList item: 2
innerList item: 1
outerList item: 3
innerList item: 1
outerList item: 4
innerList item: 1
outerList item: 5
innerList item: 1

Теперь, если мы удалим break, это будет вывод:

outerList item: 1
innerList item: 1
innerList item: 2
innerList item: 3
innerList item: 4
innerList item: 5
outerList item: 2
innerList item: 1
...

Если наВторая итерация внешнего цикла, которую вы хотите начать со второй позиции во внутреннем цикле, вам нужно использовать стандартный цикл for и целочисленный итератор, что-то вроде этого:

var outerList = new List<int> {1, 2, 3, 4, 5};
var innerList = new List<int> {1, 2, 3, 4, 5};

for (int i = 0; i < outerList.Count; i++)
{
    Console.WriteLine($"outerList item: {outerList[i]}");
    for (int j = i; j < innerList.Count; j++)
    {
        Console.WriteLine($"innerList item: {innerList[j]}");
    }
}

Thisбудет, как ожидается, напечатать:

outerList item: 1
innerList item: 1
innerList item: 2
innerList item: 3
innerList item: 4
innerList item: 5
outerList item: 2
innerList item: 2
innerList item: 3
innerList item: 4
innerList item: 5
outerList item: 3
innerList item: 3
innerList item: 4
innerList item: 5
outerList item: 4
innerList item: 4
innerList item: 5
outerList item: 5
innerList item: 5

ps Обратите внимание, как я использовал отдельные имена для внешнего / внутреннего списка, а также для итераторов.Иначе это даже не скомпилируется (@mjwills уже указал это в комментариях)

0 голосов
/ 03 июня 2019

Если вы хотите использовать один и тот же индекс из обеих коллекций, используйте код как показано ниже

for (int i = 0; i < list1.Count; i++)
{
    item item1 = list1[i];
    item item2 = list2[i];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...