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

问题描述 投票:0回答:2

所以,我试着做了一个方法,用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

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

c# linq palindrome
2个回答
2
投票

范围的第一个值将是 "1"。

所以当你调用SelectMany时,长度的第一个值将是 "1"。

第二个范围的第一个值将是 "0"。

所以之后的select将做一个从0到1的子串。

因为你的字符串是 "xyxxz",所以你的第一个结果似乎是 "x",不是吗?


1
投票

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

结果是预料之中的,因为首先你创建了一个包含有1个字符的词的数组(见first Range()),然后你从字符串的开头开始抓取字符(见second 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]
© www.soinside.com 2019 - 2024. All rights reserved.