如果我的序列如下(假设是IEnumerable<T>):
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++; } } }
我在IanG的PermuteUtils课程中取得了成功:
PermuteUtils
char[] items = new char[] { 'A', 'B', 'C', 'D', 'E' }; foreach (IEnumerable<char> permutation in PermuteUtils.Permute(items, 3)) { Console.Write("["); foreach (char c in permutation) { Console.Write(" " + c); } Console.WriteLine(" ]"); }
结果是:
[ABC] [ABD] [ABE] [ACB] [ACD] [ACE] [亚行] [ADC] [ADE] [AEB] [AEC] [AED] [BAC] [坏] [BAE] [BCA] [BCD] [BCE] [BDA] [BDC] ...