所以,我试着做了一个方法,用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
有人知道为什么会这样吗?
范围的第一个值将是 "1"。
所以当你调用SelectMany时,长度的第一个值将是 "1"。
第二个范围的第一个值将是 "0"。
所以之后的select将做一个从0到1的子串。
因为你的字符串是 "xyxxz",所以你的第一个结果似乎是 "x",不是吗?
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]