固定位置排列/组合

时间:2009-05-29 03:00:04

标签: permutation combinations

我正在寻找一种方法,我可以生成4组元素的不同组合,使得每个组元素在最终组合中具有固定的位置: 为了更好地解释我的要求,让我给出这4组的样本,最后我要找的是:

设置#1(街道预先方向){N,S} 设置#2(街道名称){Frankford,Baily} 第3集(街道类型){Ave,St} 设置#4(街道邮政方向){S}

让我列出几个期待的组合:
N Baily Ave S
S Frankford St S
S Baily Av S


现在您可以看到每个集合的元素都落入其位置 Pre Direction就位1 街道名称就位2 Streety Type就位3 街道描述在第4位

我正在寻找执行此任务的最有效方法,一种方法是一次工作2套,如: 组合第1组和第2组 - >创建一组新的结果组合 组合第5组和第3组 - >创建一组新的结果组合 组合Set 6和Set 4 - >这将给我最终组合

有没有最好的方法来做这件事?请帮助。我更喜欢C#或Java。

由于

3 个答案:

答案 0 :(得分:2)

这里有一些linq(c#)为你提供所有组合,它不是“最有效的方式”。

var query =
  from d in predirections
  from n in names
  from t in types
  from s in postdirections
  select new {d, n, t, s};

答案 1 :(得分:1)

听起来你正在寻找一些套装的笛卡尔积。您可以使用嵌套for循环来完成它。这是Haskell代码,你没有要求。

Prelude> [[x,y] | x <- ['1'..'3'], y <- ['A'..'C']]
["1A","1B","1C","2A","2B","2C","3A","3B","3C"]

答案 2 :(得分:0)

@ David B 如果预先排序列表为空,有什么方法我们仍然可以获得组合,因为通过您的方式将不会返回任何笛卡儿产品。


David B在这里:

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