好的 - 我甚至不确定术语是否正确 - 而且我确信这里一定有个术语 - 但我会尽力解释。这不完全是一个叉积,结果的顺序非常关键。
假设:
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()
来解决这个问题)。
但我还有其他视图,在考虑文化因素之前,它们本身就有其他可能的组合(时间太长了 - 但事实是,这个算法将使我能够提供许多我想要向开发人员提供的真正酷的功能!)。
我希望产生一个可接受的视图名称的搜索列表,遍历整个列表,直到找到最具体的匹配项(由这个算法产生这些连接的顺序所控制),然后提供已解析的局部视图。
搜索的结果后续可以缓存,以避免一直运行算法的开销。
我已经有一个非常基本的版本,只有一个字符串可枚举。但这是一大堆海鲜!
任何帮助都将不胜感激。