当运行一个使用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]
因此,我尝试使用 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]