我有多组数组,其中包含附加值的附加数组,用于计算数学。为了找到这些东西的最佳组合,我需要从这些数组中混合和匹配。我已经看到了类似于此的“解决方案”,但它们通常是1个阵列深度,没有真正的组合/可能性。举个例子。
我有A,B和C组.A组A包含Aa,Ab,Ac和Ad。 Aa包含一组值。为其他人推断出来。 Aa只能与Ba和Ca进行比较。我如何编写程序来查找所有组合(即Aa,Ab,Cc,Bd与Ba,Cb,Ac,Bd等比较),这样我可以比较每个组合的数学以找到最佳组合?注意:这只是一个例子,我不需要它专门为3组4组4,它需要能够扩展。
现在我知道我没有为我的变量使用非常有意义的名称,但是我会很感激,如果给出的任何代码都有明确的名称(我真的不想在代码中跟随x和c的变量)
答案 0 :(得分:5)
接受的答案似乎是正确的,但是在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<IEnumerable<T>> CartesianProduct<T>(
this IEnumerable<IEnumerable<T>> sequences)
{
IEnumerable<IEnumerable<T>> emptyProduct = new[] { Enumerable.Empty<T>() };
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/
和我对
的回答Generating all Possible Combinations
有关此问题的更多讨论。
答案 1 :(得分:-1)
假设您使用的是支持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。