Хорошо - я даже не уверен, что термин правильный - и я уверен, что обязательно будет термином для этого - но я сделаю все возможное, чтобы объяснить.Здесь это не совсем перекрестный продукт, и порядок результатов абсолютно важен.
Дано:
IEnumerable<IEnumerable<string>> sets =
new[] {
/* a */ new[] { "a", "b", "c" },
/* b */ new[] { "1", "2", "3" },
/* c */ new[] { "x", "y", "z" }
};
Где каждое внутреннее перечислимое представляет инструкцию для создания набора конкатенаций какследует (порядок здесь важен):
set a* = new string[] { "abc", "ab", "a" };
set b* = new string[] { "123", "12", "1" };
set c* = new string[] { "xyz", "xy", "x" };
Я хочу создать упорядоченные комбинации следующим образом:
set final = new string { a*[0] + b*[0] + c*[0], /* abc123xyz */
a*[0] + b*[0] + c*[1], /* abc123xy */
a*[0] + b*[0] + c*[2], /* abc123x */
a*[0] + b*[0], /* abc123 */
a*[0] + b*[1] + c*[0], /* abc12xyz */
a*[0] + b*[1] + c*[1], /* abc12xy */
a*[0] + b*[1] + c*[2], /* abc12x */
a*[0] + b*[1], /* abc12 */
a*[0] + b*[2] + c*[0], /* abc1xyz */
a*[0] + b*[2] + c*[1], /* abc1xy */
a*[0] + b*[2] + c*[2], /* abc1x */
a*[0] + b*[2], /* abc1 */
a*[0], /* abc */
a*[1] + b*[0] + c*[0], /* ab123xyz */
/* and so on for a*[1] */
/* ... */
a*[2] + b*[0] + c*[0], /* a123xyz */
/* and so on for a*[2] */
/* ... */
/* now lop off a[*] and start with b + c */
b*[0] + c*[0], /* 123xyz */
/* rest of the combinations of b + c
with b on its own as well */
/* then finally */
c[0],
c[1],
c[2]};
Очевидно, что будет много комбинаций!
Я вижу сходство с числовыми основаниями (поскольку порядок также важен), и я уверен, что здесь также скрываются перестановки / комбинации.
Вопрос в том, какнаписать алгоритм, подобный этому, который справится с любым количеством наборов строк?Linq, не Linq;Я не суетился.
Почему я это делаю?
Действительно, почему!?
В Asp.Net MVC - я хочуиметь частичные представления, которые могут быть переопределены для данной комбинации внутренней и внешней культуры и языка.Самым базовым из них было бы, для данного базового представления View
, мы могли бы иметь View-en-GB
, View-en
, View-GB
и View
в этом порядке приоритета (признавая, конечно, что язык /коды культуры могут быть одинаковыми, поэтому некоторые комбинации могут * совпадать - это решит Distinct()
).
Но у меня также есть другие представления, которые сами по себе имеют другие возможныекомбинации до культуры даже не принимаются во внимание (слишком долго, чтобы вдаваться в это - но факт в том, что этот алгоритм даст целую кучу действительно крутых, которые я хочу предложить своим разработчикам!).
Я хочу создать список поиска всех допустимых имен представлений, перебирать весь лот до тех пор, пока не будет найдено наиболее конкретное совпадение (в соответствии с порядком, в котором этот алгоритм будет производить эти объединения), а затем податьвверх разрешенное частичное представление.
Результат поиска может быть впоследствии кэширован, чтобы избежать затрат на постоянное выполнение алгоритма.
У меня уже есть результату базовой версии этой работы, которая имеет только одну из перечисляемых строк.Но это совсем другой чайник морепродуктов!
Любая помощь очень ценится.