Почему при запуске метода, который использует linq для получения палиндромов из строки, SelectMany упорядочивает результирующие строки? - PullRequest
0 голосов
/ 18 июня 2020

Итак, я попытался создать метод, который приводил к получению всех возможных палиндромов из строки, используя linq. Вот на что похож метод: `

public IEnumerable<string> MakingPalindromesFromAString(string source)
        {
            return Enumerable
                .Range(1, source.Length)
                .SelectMany(length => Enumerable.Range(0, source.Length - length + 1)
                                                .Select(a => source.Substring(a, length)))
                                                .Where(b => b.SequenceEqual(b.Reverse()))
                .ToArray();
        }

Теперь я не понимаю, почему (или как) SelectMany упорядочивает Enum? Потому что для этого примера:

"xxyxxz"

результат (из того, как я пытался запустить метод вручную) должен был быть следующим:

z xxyxx xx x xyx x y xx x x

, но вместо этого это:

x x y x x z xx xx xyx xxyxx

Кто-нибудь знает, почему это происходит?

Ответы [ 2 ]

2 голосов
/ 18 июня 2020

Первое значение диапазона будет «1».

Итак, когда вы вызовете SelectMany, первое значение длины будет «1».

Первое значение второго диапазон будет «0».

Таким образом, выбор после этого создаст подстроку от 0 до 1.

И поскольку ваша строка - «xxyxxz», кажется, что ваш первый результат - «x ", не так ли?

1 голос
/ 18 июня 2020

SelectMany сглаживает (объединяет) массивы в один массив.

Результат является ожидаемым, так как сначала вы создаете массив со словами, состоящими из 1 символа (см. Первый Range ()), и начинаете с захвата символов с начала строки (см. Диапазон секунд). Затем вы go добавляете слова из 2 символов, et c ...

SelectMany () объединяет все эти массивы в том порядке, в котором они были созданы.

"xxyxxz"

[x, x, y, x, x, z]
[xx, xx]
[xyx]
[xxyxx]

=> SelectMany() produces:
[x, x, y, x, x, z, xx, xx, xyx, xxyxx]
...