Pregunta

Estoy buscando una manera en la que pueda generar diferentes combinaciones de 4 elementos de conjuntos de tal manera que cada elemento de set tiene un lugar fijo en la combinación final: para explicar mejor mi requisito, permítame dar una muestra de esos 4 conjuntos y finalmente lo que yo estoy buscando:

SET#1 (Street PrefireCe) {n, S} Set#2 (nombre de la calle) {Frankford, Baily} Set#3 (Tipo de calle) {Ave, ST} Set#4 (Dirección de posts Post) {S}

Permítanme enumerar algunas combinaciones esperando:
N Baily Ave S
S Frankford St S
S baily av s
.
.
.

Ahora, como puede ver, el elemento de cada set está cayendo en su lugar
La preferencia está en su lugar 1
El nombre de la calle está en su lugar 2
El tipo de calle está en su lugar 3
La descripción de la calle está en su lugar 4

Estoy buscando la forma más eficiente de llevar a cabo esta tarea, una forma de hacerlo es trabajar en 2 sets a la vez como:
Realice la combinación del conjunto 1 y el conjunto 2 -> Crear un nuevo conjunto 5 de combinaciones resultantes
Haga la combinación del conjunto 5 y el conjunto 3 -> Crear un nuevo conjunto 6 de combinaciones resultantes
Haga la combinación del conjunto 6 y el conjunto 4 -> Esto me dará las combinaciones finales

¿Hay una mejor manera de hacer esto? Amable ayuda. Preferiré C# o Java.

Gracias

¿Fue útil?

Solución 3

@ David B ¿Qué pasa si la lista de predirecciones está vacía? ¿Hay alguna manera de que todavía obtengamos las combinaciones, ya que a través de su camino se devuelve ninguno de los productos cartesianos?


David B aquí:

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

Otros consejos

Aquí hay algunos Linq (C#) que le brinda todas las combinaciones, no es "la forma más 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 estás buscando el producto cartesiano de algunos conjuntos. Puedes hacerlo usando bucles anidados. Aquí está el código Haskell, que no solicitó.

Prelude> [[x,y] | x <- ['1'..'3'], y <- ['A'..'C']]
["1A","1B","1C","2A","2B","2C","3A","3B","3C"]
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top