当运行一个使用linq从字符串中获取回文的方法时,为什么SelectMany会对结果字符串进行排序?

When running a method that uses linq to get the palindromes from a string, why does SelectMany order the resulting strings?

因此,我尝试使用 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 为什么(或如何)对枚举进行排序?因为,对于这个例子:

"xxyxxz"

输出(从我如何尝试 运行 手动方法)应该是这样的:

z xxyxx xx x xyx x y xx x x

而是这样:

x x y x x z xx xx xyx xxyxx

有人知道为什么会这样吗?

范围的第一个值将为“1”。

因此,当您调用 SelectMany 时,长度的第一个值将为“1”。

第二个范围的第一个值将为“0”。

所以之后的select会生成一个从0到1的子串。

并且由于您的字符串是 "xxyxxz",因此您的第一个结果似乎是连贯的 "x",不是吗?

SelectMany 将数组展平(合并)为一个数组。

结果是预期的,因为首先您创建了一个包含具有 1 个字符的单词的数组(请参阅第一个 Range()),然后您从字符串开头抓取字符(请参阅秒范围)。然后你继续用2个字符的单词,等等...

SelectMany() 按创建顺序合并所有这些数组。

"xxyxxz"

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

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