Seeing that you have clarified that there can be more than two inputs, I've written a modified algorithm, with the same unit test as before, and a new one:
public static class PairsOfConnections
{
public static IEnumerable<Tuple<string, string>> GetAllPairsOfConnections(string[] inputs, string[] outputs)
{
var connectionsFromFirstInput = outputs.Select(o => new { Input = inputs[0], Output = o }).ToList();
var result = new List<Tuple<string, string>>();
foreach (string input in inputs.Skip(1))
{
var connectionsFromNextInput = outputs.Select(output => new { Input = input, Output = output }).ToList();
IEnumerable<Tuple<string, string>> pairs = from a in connectionsFromFirstInput
from b in connectionsFromNextInput
where a.Output != b.Output
select new Tuple<string, string>(a.Input + a.Output, b.Input + b.Output);
result.AddRange(pairs);
}
return result;
}
}
public class PairsOfConnectionsTests
{
[Test]
public void TestGetAllPairsOfConnections_WithTwoInputs()
{
string[] input = { "A", "B" };
string[] output = { "1", "2", "3", "4" };
IEnumerable<Tuple<string, string>> result = PairsOfConnections.GetAllPairsOfConnections(input, output);
var expected = new List<Tuple<string, string>>
{
new Tuple<string, string>("A1","B2"),
new Tuple<string, string>("A1","B3"),
new Tuple<string, string>("A1","B4"),
new Tuple<string, string>("A2","B1"),
new Tuple<string, string>("A2","B3"),
new Tuple<string, string>("A2","B4"),
new Tuple<string, string>("A3","B1"),
new Tuple<string, string>("A3","B2"),
new Tuple<string, string>("A3","B4"),
new Tuple<string, string>("A4","B1"),
new Tuple<string, string>("A4","B2"),
new Tuple<string, string>("A4","B3")
};
CollectionAssert.AreEquivalent(expected, result);
}
[Test]
public void TestGetAllPairsOfConnections_WithThreeInputs()
{
string[] input = { "A", "B", "C" };
string[] output = { "1", "2", "3" };
IEnumerable<Tuple<string, string>> result = PairsOfConnections.GetAllPairsOfConnections(input, output);
var expected = new List<Tuple<string, string>>
{
new Tuple<string, string>("A1","B2"),
new Tuple<string, string>("A1","B3"),
new Tuple<string, string>("A1","C2"),
new Tuple<string, string>("A1","C3"),
new Tuple<string, string>("A2","B1"),
new Tuple<string, string>("A2","B3"),
new Tuple<string, string>("A2","C1"),
new Tuple<string, string>("A2","C3"),
new Tuple<string, string>("A3","B1"),
new Tuple<string, string>("A3","B2"),
new Tuple<string, string>("A3","C1"),
new Tuple<string, string>("A3","C2"),
};
CollectionAssert.AreEquivalent(expected, result);
}
}