Linq to return ALL pairs of elements from two lists?

前端 未结 7 1506
日久生厌
日久生厌 2021-01-17 10:56

Given lists l1 = {1, 2} and l2 = {4, 5, 6 } I want to get a new list that has elements:

rez = { {1, 4}, {1, 5}, {1, 6}, {2, 4}, {2,         


        
相关标签:
7条回答
  • 2021-01-17 11:48

    Yes it is possible. Eric Lippert wrote a very good article on this topic:

    Computing a Cartesian Product with LINQ

    If you only have 2 lists, then you could directly use multiple from like this:

    from a in s1 
    from b in s2 
    select new [] { a, b};
    

    or even:

    s1.SelectMany(a => s2.Select(b => new [] { a, b }));
    

    But the solution given by Eric Lippert in the previous article allows you to compute the cartesian product of several sequences. With the following extension method:

    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 }));
    }
    

    You could write:

    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)+"}");
    }
    

    And obtain:

    {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}
    
    0 讨论(0)
提交回复
热议问题