给定列表 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)
规则:
连接示意图 {A1, B3}
建议?
更新答案
这应该可以做到:
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>。