【发布时间】:2010-06-10 12:02:02
【问题描述】:
好的 - 我什至不确定这个术语是否正确 - 我确信 一定 是这个术语 - 但我会尽力解释。这不是一个交叉产品,结果的顺序是绝对关键的。
给定:
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() 将解决此问题。
但我也有其他观点,在考虑文化之前,它们本身就有其他可能的组合(太长了,无法深入 - 但事实是,这个算法将启用一大堆真的 很酷,我想为我的开发人员提供服务!)。
我想生成一个包含所有可接受视图名称的搜索列表,遍历整个批次,直到找到 最具体的 匹配项(由该算法生成这些连接的顺序决定)然后提供已解决的部分视图。
搜索结果可以稍后被缓存以避免一直运行算法的开销。
我已经有了这个工作的一个非常基本的版本,它只有一个可枚举的字符串。但这是一锅完全不同的海鲜!
非常感谢任何帮助。
【问题讨论】: