从各种可能性中寻找所有组合

我有多组数组,其中包含附加值的附加数组,我用它来计算数学。 为了找到这些东西的最佳组合,我需要混合和匹配这些数组。 我已经看到了类似于此的“解决方案”,但它们通常是1个深度arrays,没有真正的组合/可能性。 所以举个例子。

我有套A,B和C.套装A包含Aa,Ab,Ac和Ad。 Aa包含一组值。 为其他人推断出来。 Aa只能与Ba和Ca进行比较。 如何编写程序来查找所有组合(即Aa,Ab,Cc,Bd与Ba,Cb,Ac,Bd等比较),这样我可以比较每个组合的数学,找到最好的组合? 注意:这只是一个例子,我不需要它专门为3组4组4,它需要能够扩展。

现在我知道我没有为我的变量使用非常有意义的名称,但是我会很感激,如果给出的任何代码中都有有意义的名称(我真的不想在代码中遵循x和c的变量)。

接受的答案似乎是正确的,但在C#中做笛卡尔积是一种非常奇怪的方法。 如果您有一定数量的序列,您可以像下面这样使用其笛卡尔积:

var aList = new[] { "a1", "a2", "a3" }; var bList = new[] { "b1", "b2", "b3" }; var cList = new[] { "c1", "c2", "c3" }; var product = from a in aList from b in bList from c in cList select new[] { a, b, c }; foreach (var p in product) Console.WriteLine(string.Join(",", p)); 

如果您有任意需要使用笛卡尔积的序列,那么您可以这样做:

 static class Extensions { public static IEnumerable> CartesianProduct( this IEnumerable> sequences) { IEnumerable> emptyProduct = new[] { Enumerable.Empty() }; return sequences.Aggregate( emptyProduct, (accumulator, sequence) => from accseq in accumulator from item in sequence select accseq.Concat(new[] {item})); } } 

然后:

  var aList = new[] { "a1", "a2", "a3" }; var bList = new[] { "b1", "b2", "b3" }; var cList = new[] { "c1", "c2", "c3" }; var lists = new[] { aList, bList, cList }; var product = lists.CartesianProduct(); foreach (var p in product) Console.WriteLine(string.Join(",", p)); 

看到

http://ericlippert.com/2010/06/28/computing-a-cartesian-product-with-linq/

我的答案

生成所有可能的组合

有关此问题的更多讨论。

假设您使用的是支持LINQ的C#版本:

 static void Main(string[] args) { // declare some lists var aList = new string[] { "a1", "a2", "a3" }; var bList = new string[] { "b1", "b2", "b3" }; var cList = new string[] { "c1", "c2", "c3" }; // do the equivalent of a SQL CROSS JOIN var permutations = aList .Join(bList, a => "", b => "", (a, b) => new string[] { a, b }) .Join(cList, ab => "", c => "", (ab, c) => new string[] { ab[0], ab[1], c }); // print the results Console.WriteLine("Permutations:"); foreach (var p in permutations) Console.WriteLine(string.Join(", ", p)); } 

使用lambda表达式将字符串指向空字符串的Join调用会导致Join函数将字符串视为相等,从而模拟SQL CROSS JOIN。