LINQ - Gerando um Produto Cartesiano (SelectMany)


 Neste artigo veremos como gerar um produto cartesiano usando LINQ e a linguagem C#.

Um produto cartesiano é por definição um produto direto de dois conjuntos.

Vamos assumir que temos dois conjuntos:

{A, B, C} e  {1, 2, 3}

O produto cartesiano destes dois conjunetos será o seguinte conjunto:

{(A,1), (A,2), (A,3), (B,1), (B,2), (B,3), (C,1), (C,2), (C,3)}

Da matemática temos que : Sejam os conjuntos A = {1, 2, 3}  e  B = {3, 4}.

Com auxílio do diagrama de flechas ao lado, formaremos o conjunto de todos os pares ordenados em que o 1º elemento pertença ao conjunto A e o 2º pertença ao conjunto B.

Assim, obtemos o conjunto: {(1, 3), (1, 4), (2, 3), (2, 4), (3, 3), (3, 4)}

Esse conjunto é denominado produto cartesiano de A por B, sendo indicado por:

fonte : https://www.somatematica.com.br/fundam/produtocartesiano.php

O nosso interesse é usar os recursos da LINQ para obter o produto cartesiano entre duas sequências usando o método SelectMany que projeta cada elemento de uma sequência em um IEnumerable<T> e nivela as sequências resutantes em uma sequência.

Como o SelectMany funciona ?

O método SelectMany, da LINQ, colapsa muitos elementos em uma única coleção sendo que a coleção resultante é de outro tipo de elemento.

Vamos mostrar um exemplo bem básico para você entender como o SelectMany funciona.

Vamos definir um array de strings e vamos usar o método SelectMany neste array, onde o argumento para o método será uma expressão lambda que vai especificar que cada string será convertida em um array de caracteres que serão combinados.

        static void Main(string[] args)
        {
            string[] array ={"Macoratti","net"};
            // Converte cada string no array para um array de caracteres.
            // ... A seguir combina esses caracteres em único.
            var resultado = array.SelectMany(elemento => elemento.ToCharArray());
            // Exibe as letras
            foreach (char letra in resultado)
            {
                Console.WriteLine(letra);
            }
            Console.ReadLine();
        }

Assim, sempre que você pode alterar um elemento em uma matriz ou coleção de itens, você pode usar SelectMany para simplificar os dados. Se você tiver uma matriz de strings separadas por delimitadores, poderá usar SelectMany após dividi-las.

O resultado final é um array de todas as partes individuais de todas as strings

Agora voltando ao nosso exemplo, vamos ver como podemos gerar o produto cartesiano:

using System;
using System.Linq;
namespace LINQ_ProdutoCartesiano
{
    class Program
    {
        static void Main(string[] args)
        {
            var sequenciaA = new String[] { "A", "B", "C" };
            var sequenciaB = new String[] { "1", "2", "3" };
            var produtoCartesiano = 
                sequenciaA.SelectMany(x=> sequenciaB.Select(y => x+y));
            foreach(var lista in produtoCartesiano)
            {
                Console.WriteLine(lista);
            }
            Console.ReadKey();
        }
    }
}

No código acima temos que :

  var produtoCartesiano = sequenciaA.SelectMany(x=> sequenciaB.Select(y => x+y));

esta projetando cada elemento da sequencia em um IEnumerable<T> gerando uma sequência que é a concatenação da sequenciaA e sequenciaB.

E estamos conversados...

"Tomando sobretudo o escudo da fé, com o qual podereis apagar todos os dardos inflamados do maligno. "
Efésios 6:16

Veja os Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Quer aprender C# ??

Quer aprender os conceitos da Programação Orientada a objetos ?

Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ?

Referências:


José Carlos Macoratti