使用 LINQ 从两个列表中获取所有可能的连接对

ehh*_*ehh 4 .net c# linq

给定列表 Input = {A, B} 和 Output = {1, 2, 3, 4 },我想获得一个包含所有可能的连接对 {connection1,connection2} 的新列表:

connections = {A1, B2}, 
         {A1, B3}, 
         {A1, B4}, 
         {A2, B1},
         {A2, B3}, 
         {A2, B4}, 
         {A3, B1},
         {A3, B2},
         {A3, B4}, 
         {A4, B1},
         {A4, B2},
         {A4, B3}
Run Code Online (Sandbox Code Playgroud)

规则

  • 每个组合代表一对 2 连接。
  • 每个连接由 1 个输入和 1 个输出表示。(例如AB是不可能的)
  • 如果输入或输出元素已在上一个连接中使用,则不能在下一个连接中使用它。(例如,{A1,B1} 是不可能的)
  • 输入可以包含 n 个元素 (n>=2),输出可以包含 m 个元素 (m>=2),但组合始终仅由 2 个连接表示。

连接示意图 {A1, B3}

在此输入图像描述

建议?

Ric*_*ard 5

更新答案

这应该可以做到:

using System.Linq;
using static System.Console;

class Program {
    static void Main(string[] args) {
        var inputs = new[] { "A", "B", "C" };
        var outputs = new[] { "1", "2", "3", "4" };

        var res = from i1 in inputs
                  from i2 in inputs
                  where i1 != i2
                  from o1 in outputs
                  from o2 in outputs
                  where o1 != o2
                  let c1 = i1 + o1
                  let c2 = i2 + o2
                  // Avoid {x,y} and {y,x} in result.
                  where c1.CompareTo(c2) < 0
                  select (first: c1, second: c2);

        foreach (var r in res) {
            WriteLine($"{{{r.first}, {r.second}}}");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

原答案

您需要相当于交叉联接的 LINQ to Objects,它只是循环两个列表的内容,没有任何条件来限制结果集。

var allPairs = (from a in ListA
                from b in ListB
                select (a, b)
               ).ToList();
Run Code Online (Sandbox Code Playgroud)

将为您提供所有对作为元组的列表。

在您的情况下,您似乎想要所有对的对:给定输入和输出的所有组合,然后获取输入和输出的所有组合对。

这只是用所有输入-输出组合的列表的第二组合来扩展上述的情况。

// Assume `Input` and `Output` and enumerables of string
var inputOutputPairs = (from ip in Input
                        from op in Output
                        select ip + op
                       ).ToList();

var result = (from left in inputOutputPairs
              from right in inputOutputPairs
              select (left, right)
              // To avoid duplicates like ("A4","A4") include this:
              // where left != right
             ).ToList();
Run Code Online (Sandbox Code Playgroud)

结果将是一个列表ValueTuple<string, string>