与重复C#的组合

我需要帮助组合重复。 已经在网上搜索过,虽然我发现了一些例子但我完全无法理解它们。 我的目标很简单,一个函数(CombinationsWithRepetiion)接收带有项目的列表(在本例中为整数值)和长度(表示每个组合可以有多长)并返回包含结果的列表。

List input = new List() {1, 2, 3} CombinationsWithRepetition(input, length); 

结果:

长度= 1:1,2,3

长度= 2:11,12,13,21,22,23,31,32,33

长度= 3:111,112 ….

我希望有人帮助我,并提前感谢你!

递归

好,

这是C#版本 – 我将引导您完成它

 static IEnumerable CombinationsWithRepition(IEnumerable input, int length) { if (length <= 0) yield return ""; else { foreach(var i in input) foreach(var c in CombinationsWithRepition(input, length-1)) yield return i.ToString() + c; } } 

首先检查递归的边界情况(在这种情况下,如果length <= 0 ) - 在这种情况下,答案是空字符串(顺便说一句:我选择返回字符串,因为你没有说出你真正需要的东西 - 应该是容易改变)。

在任何其他情况下,你看看每个输入i和recursivley采取下一个较小的组合,只需将它们连接在一起(使用String-concatination,因为我想要字符串)。

我希望你理解IEnumerable / yield东西 - 如果不是在评论中这样说的话。

这是一个示例输出:

 foreach (var c in CombinationsWithRepition(new int[]{1,2,3}, 3)) Console.WriteLine (c); 111 112 113 ... 332 333 

转换数字

下面使用我在下面的注释中概述的想法,并且没有堆栈溢出exception的问题(递归可能适用于大长度) - 这也假定字符串,因为它们更容易使用(我可以做一个简单的PadLeft来简化事情)

 static String Convert(string symbols, int number, int totalLen) { var result = ""; var len = symbols.Length; var nullSym = symbols [0]; while (number > 0) { var index = number % len; number = number / len; result = symbols [index] + result; } return result.PadLeft (totalLen, nullSym); } static IEnumerable CombinationsWithRepition(string symbols, int len) { for (var i = 0; i < Math.Pow(symbols.Length,len); i++) yield return Convert (symbols, i, len); } 
  string[] items = {"1", "2", "3"}; var query = from i1 in items from i2 in items from i3 in items select i1 + i2 + i3 ; foreach(var result in query) Console.WriteLine(result); Console.ReadKey();