如果我有一个序列,如下所示(假设它是一个
IEnumerable<T>
):[A, B, C, D, E]
那么,计算给定长度的所有可能(连续和非连续)子序列的最清洁的方法是什么?结果集中的顺序不重要,但不应包含重复项。
例如,如果我想计算长度为3的所有可能子序列,则结果集将为:
[A, B, C]
[A, B, D]
[A, B, E]
[A, C, D]
[A, C, E]
[A, D, E]
[B, C, D]
[B, C, E]
[B, D, E]
[C, D, E]
就记录而言,下面的被接受的答案为我提供了一个良好的起点,这是我使用的代码,更新后使用了一些新的.NET 3.5扩展方法:
public static IEnumerable<IEnumerable<T>> Subsequences<T>(
this IEnumerable<T> source,
int count)
{
if (count == 0)
{
yield return Enumerable.Empty<T>();
}
else
{
var skip = 1;
foreach (var first in source)
{
foreach (var rest in source.Skip(skip).Subsequences(count - 1))
{
yield return Enumerable.Repeat(first, 1).Concat(rest);
}
skip++;
}
}
}