从可能性集中找到所有组合

本文关键字:组合 可能性 集中 | 更新日期: 2023-09-27 18:34:25

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

我有集合 A、B 和 C.集合 A 包含 Aa、Ab、AC 和 Ad。为其他人推断出来。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<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/

和我的回答

生成所有可能的组合

有关此问题的更多讨论。

假设您使用的是支持 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 表达式将字符串指向空字符串的联接调用会导致联接函数将字符串视为相等,从而模拟 SQL 交叉联接。