Pergunta

Estou procurando uma maneira de gerar diferentes combinações de 4 elementos de conjuntos de forma que cada elemento do conjunto tenha um lugar fixo na combinação final:Para explicar melhor minha necessidade, deixe-me dar uma amostra desses 4 conjuntos e, finalmente, o que estou procurando:

Conjunto#1 (pré -direção da rua) {n, S} Set#2 (Nome da rua) {Frankford, Baily} Set#3 (tipo de rua) {Ave, St} Set#4 (direção da rua) {S}

Deixe-me listar algumas combinações esperadas:
N Baily Ave S
S Frankford St S
S Baily Av S
.
.
.

Agora, como você pode ver, cada elemento do conjunto está se encaixando em seu lugar
A pré-direção está no lugar 1
O nome da rua está no lugar 2
Streety Type está no lugar 3
A descrição da rua está no lugar 4

Estou procurando a maneira mais eficiente de realizar esta tarefa. Uma maneira de fazer isso é trabalhar em 2 séries ao mesmo tempo, como:
Faça a combinação do conjunto 1 e do conjunto 2 -> crie um novo conjunto 5 de combinações resultantes
Faça a combinação do conjunto 5 e do conjunto 3 -> crie um novo conjunto 6 de combinações resultantes
Faça a combinação do conjunto 6 e do conjunto 4 -> Isso me dará as combinações finais

Existe a melhor maneira de fazer isso?Por favor, ajude.Prefiro C# ou Java.

Obrigado

Foi útil?

Solução 3

@ David B E se a lista de prediras estiver vazia, existe uma maneira de ainda conseguirmos as combinações, pois, através do seu caminho, nenhum produto cartesiano será devolvido.


David B aqui:

var query =
  from d in predirections.DefaultIfEmpty()
  from n in names.DefaultIfEmpty()
  from t in types.DefaultIfEmpty()
  from s in postdirections.DefaultIfEmpty()
  select new {d, n, t, s};

Outras dicas

Aqui estão alguns linq (c #) que fornecem todas as combinações, não é "a maneira mais eficiente".

var query =
  from d in predirections
  from n in names
  from t in types
  from s in postdirections
  select new {d, n, t, s};

Parece que você está procurando o produto cartesiano de alguns conjuntos.Você pode fazer isso usando loops for aninhados.Aqui está o código Haskell, que você não pediu.

Prelude> [[x,y] | x <- ['1'..'3'], y <- ['A'..'C']]
["1A","1B","1C","2A","2B","2C","3A","3B","3C"]
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top