【问题标题】:When running a method that uses linq to get the palindromes from a string, why does SelectMany order the resulting strings?在运行使用 linq 从字符串中获取回文的方法时,为什么 SelectMany 对结果字符串进行排序?
【发布时间】:2020-06-18 12:40:58
【问题描述】:

所以,我尝试使用 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


    【解决方案1】:

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

    所以当您调用 SelectMany 时,长度的第一个值将是“1”。

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

    所以之后的选择会产生一个从 0 到 1 的子字符串。

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

    【讨论】:

    • 谢谢。现在更有意义了。
    【解决方案2】:

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

    结果是预期的,因为首先您创建一个包含 1 个字符的单词的数组(参见第一个 Range()),然后从字符串开头抓取字符开始(参见秒 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]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-01-05
      • 2013-03-09
      • 2011-07-27
      • 2017-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多