Ja, es ist möglich. Eric Lippert hat einen sehr guten Artikel zu diesem Thema:
Computing a Cartesian Product with LINQ
Wenn Sie nur zwei Listen haben, dann könnte man direkt mehr from
wie folgt verwenden:
from a in s1
from b in s2
select new [] { a, b};
oder sogar:
s1.SelectMany(a => s2.Select(b => new [] { a, b }));
Aber die Lösung von Eric Lippert im vorherigen Artikel angegebenen können Ihnen das kartesische Produkt aus mehreren Sequenzen berechnen. Mit der folgenden Erweiterungsmethode:
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 }));
}
könnten Sie schreiben:
var l1 = new[] {1, 2};
var l2 = new[] {4, 5, 6};
var l3 = new[] {7, 3};
foreach (var result in new []{l1,l2,l3}.CartesianProduct())
{
Console.WriteLine("{"+string.Join(",",result)+"}");
}
Und erhalten:
{1,4,7}
{1,4,3}
{1,5,7}
{1,5,3}
{1,6,7}
{1,6,3}
{2,4,7}
{2,4,3}
{2,5,7}
{2,5,3}
{2,6,7}
{2,6,3}
Beachten Sie, dass dies ein Duplikat von http://stackoverflow.com/questions/3093622/ –