Перестановка/комбинация с фиксированным местом

Я ищу способ, с помощью которого я могу сгенерировать различные комбинации элементов 4 наборов таким образом, чтобы каждый элемент набора имел фиксированное место в окончательной комбинации: Чтобы лучше объяснить мое требование, позвольте мне привести образец этих 4 наборов и, наконец, то, что я ищу:

Набор № 1 (Направление улицы) { N, S } Набор № 2 (Название улицы) {Франкфорд, Бейли} Набор № 3 (Тип улицы) {Авеню, улица} Набор № 4 (Направление улицы) {S}

Позвольте мне перечислить несколько ожидаемых комбинаций:
N Baily Ave S
S Frankford St S
S Baily Av S
.
.
.

Теперь, как вы можете видеть, каждый элемент набора встает на свое место
Pre Direction находится на месте 1
Название улицы находится на месте 2
Тип улицы находится на месте 3
Описание улицы находится на месте 4

Я ищу наиболее эффективный способ выполнить эту задачу. Один из способов сделать это — работать над двумя наборами одновременно, например:
Скомбинировать набор 1 и набор 2 --> создать новый набор 5 из результирующие комбинации
Создать комбинацию набора 5 и набора 3 --> создать новый набор 6 из полученных комбинаций
Создать комбинацию набора 6 и набора 4 --> Это даст мне окончательные комбинации

Есть ли лучший способ сделать это? Пожалуйста, помогите. Я предпочту C# или Java.

Спасибо


person CodeChamp    schedule 29.05.2009    source источник


Ответы (3)


Вот некоторый linq (С#), который дает вам все комбинации, это не «самый эффективный способ».

var query =
  from d in predirections
  from n in names
  from t in types
  from s in postdirections
  select new {d, n, t, s};
person Amy B    schedule 29.05.2009

Похоже, вы ищете декартово произведение некоторых множеств. Вы можете сделать это, используя вложенные циклы for. Вот код Haskell, который вы не просили.

Prelude> [[x,y] | x <- ['1'..'3'], y <- ['A'..'C']]
["1A","1B","1C","2A","2B","2C","3A","3B","3C"]
person Dietrich Epp    schedule 29.05.2009

@ Дэвид Б. Что, если список преднаправлений пуст, есть ли способ, которым мы все еще получаем комбинации, поскольку по вашему пути ни одно декартово произведение не будет возвращено.


Дэвид Б здесь:

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};
person CodeChamp    schedule 29.05.2009