列出组合c#

我有4个collections品。

{ A1, A2, A3, ...} { B1, B1, B3, ...} { C1, C2, C3, ...} { D1, D2, D3, ...} 

我需要使用以下规则找到所有可能的组合:

  1. 第一和第四个集合中的1个项目
  2. 第二个系列中的2件商品
  3. 来自第三个的3个项目

示例组合:

 {A1, B1, B2, C1, C2, C3, D1} {A2, B1, B2, C1, C2, C3, D1} 

Visual Studio加载时间太长,因此我在JavaScript中进行了操作,因为我可以在控制台中进行测试。 这将打印出所有选择。 (听起来更像是“算法的算法是什么?”而不是“ C#中的算法是什么?”)

 function makeGroup(id, count) { var result = []; for (var i = 1; i <= count; i++) { result.push(id + i); } return result; } function choose(group, count) { if (count === 1) { var result = []; for (var i = 0; i < group.length; i++) { result.push([group[i]]); } return result; } if (count === 2) { var result = []; for (var i = 0; i < group.length; i++) { for (var j = 0; j < group.length; j++) { if (i !== j && i < j) { result.push([group[i], group[j]]); } } } return result; } if (count === 3) { var result = []; for (var i = 0; i < group.length; i++) { for (var j = 0; j < group.length; j++) { for (var k = 0; k < group.length; k++) { if (i !== j && i !== k && j !== k && i < j && j < k) { result.push([group[i], group[j], group[k]]); } } } } return result; } } var groupA = makeGroup('A', 2); var groupB = makeGroup('B', 2); var groupC = makeGroup('C', 3); var groupD = makeGroup('D', 1); choose(groupA, 1).forEach(function (a) { choose(groupB, 2).forEach(function (b) { choose(groupC, 3).forEach(function (c) { choose(groupD, 1).forEach(function (d) { console.log(a + " " + b[0] + " " + b[1] + " " + c[0] + " " + c[1] + " " + c[2] + " " + d[0]); }); }); }); }); 

输出示例:

 A1 B1 B2 C1 C2 C3 D1 A2 B1 B2 C1 C2 C3 D1 

要查看它的工作示例,您可以执行以下操作:

 var testGroup = makeGroup('T', 4); var choose1 = choose(testGroup, 1); var choose2 = choose(testGroup, 2); var choose3 = choose(testGroup, 3); console.log(JSON.stringify(choose1)); console.log(JSON.stringify(choose2)); console.log(JSON.stringify(choose3)); 

并看到它选择正确:

 [["T1"],["T2"],["T3"],["T4"]] [["T1","T2"],["T1","T3"],["T1","T4"],["T2","T3"],["T2","T4"],["T3","T4"]] [["T1","T2","T3"],["T1","T2","T4"],["T1","T3","T4"],["T2","T3","T4"]] 

我已创建此代码以执行您想要的操作:

 var aa = new[] { "A1", "A2", "A3", "A4" }; var bb = new[] { "B1", "B2", "B3", "B4" }; var cc = new[] { "C1", "C2", "C3", "C4" }; var dd = new[] { "D1", "D2", "D3", "D4" }; var query = from a in aa.SelectMembers() from b1 in bb.SelectMembers() from b2 in b1.Remainder.SelectMembers() from c1 in cc.SelectMembers() from c2 in c1.Remainder.SelectMembers() from c3 in c2.Remainder.SelectMembers() from d in aa.SelectMembers() select new [] { a.Selected, b1.Selected, b2.Selected, c1.Selected, c2.Selected, c3.Selected, d.Selected, }; 

就我的例子而言,它产生了4,608种组合。

 A1, B1, B2, C1, C2, C3, A1 A1, B1, B2, C1, C2, C3, A2 A1, B1, B2, C1, C2, C3, A3 ... A4, B4, B3, C4, C3, C2, A3 A4, B4, B3, C4, C3, C2, A4 

您需要的两个支持代码位是:

 public static class Ex { public static IEnumerable> SelectMembers(this IEnumerable @this) { if (@this == null || !@this.Any()) { yield break; } else { for (var i = 0; i < @this.Count(); i++) { yield return new Member(@this.Skip(i).First(), @this.Take(i).Concat(@this.Skip(i + 1))); } } } } public sealed class Member { private readonly T _Selected; private readonly IEnumerable _Remainder; public T Selected { get { return _Selected; } } public IEnumerable Remainder { get { return _Remainder; } } public Member(T Selected, IEnumerable Remainder) { _Selected = Selected; _Remainder = Remainder; } } 
  string[] A = { "a1", "a2", "a3", "a4", "a5" }; string[] B = { "b1", "b2", "b3", "b4", "b5", "b6", "b7", "b8", "b9", "b10"}; string[] C = { "c1", "c2", "c3", "c4", "c5", "c6", "c7", "c8", "c9", "c10", "c11", "c12", "c13", "c14", "c15"}; string[] D = { "d1", "d2", "d3", "d4", "d5"}; for(int i=0; i 

输出将是这样的:

a1b1b2c1c2c3d1 a2b3b4c4c5c6d2 .....