Почему переменная, определенная в for l oop, превышает верхний предел, когда я хочу распечатать результат? - PullRequest
1 голос
/ 10 июля 2020
string table = "?-?";
string[] chars = { "&", "x" };
IEnumerable<string> vs = new List<string> { "" };

for (int i = 0; i < table.Length; i++)
{
    if (table[i] != '?')
        vs = vs.Select(x => x + table[i]);
    else
        vs = vs.SelectMany(x => chars.Select(y => x + y));
}

Я могу запустить и скомпилировать вышеуказанное без каких-либо исключений, но когда я пытаюсь увидеть элементы в vs с помощью Console.WriteLine(string.Join(", ", vs));, я получаю System.IndexOutOfRangeException в строке vs = vs.Select(x => x + table[i]);.

Причина исключения: i. Странно то, что i это 3 в окне «Локальные», а у меня i < table.Length в for l oop. Итак, i не может быть 3, но это так!

Мой вопрос в том, почему i становится 3 и почему исключение появляется только тогда, когда я хочу распечатать результат.

enter image description here

I've tried the following to print the output too, but I got the same result.

foreach (var comb in vs)
    Console.WriteLine(comb);

Ответы [ 2 ]

4 голосов
/ 10 июля 2020

Посмотрите в окно «Локальные»: ваша переменная i получает значение 3 - таким образом, исключение.

И почему это 3? Это потому, что вы увеличили его в l oop. Но подождите, ваш Select находится внутри l oop, поэтому он не должен быть больше 2, верно?

Неправильно.

Это называется "переменная, захваченная лямбда ". Найдите это, чтобы узнать больше.

Решение:

for (int i = 0; i < table.Length; i++)
{
    int j = i;
    vs = vs.Select(x => x + table[j]);
    // and so on
}
0 голосов
/ 10 июля 2020

Ну, вам нужно вызвать ToList() по запросу Linq. Внесите изменения, например,

public static void Main()
{
   string table = "?-?";
   string[] chars = { "&", "x" };
   List<string> vs = new List<string> { "" };

    for (int i = 0; i < table.Length; i++)
    {
        if (table[i] != '?')
            vs = vs.Select(x => x + table[i]).ToList();
        else
            vs = vs.SelectMany(x => chars.Select(y => x + y)).ToList();
    }
    Console.WriteLine(string.Join(", ", vs));
}

Вывод:

& - &, & -x, x- &, xx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...