2012-04-17 37 views
0

我正在开发一个项目,我需要找到一个数组的所有可能的排列组合。阵列中的数组排列

我有这个工作,到一个点

var geneticsArray = new[] { new[] { "M", "V" }, new[] { "M", "V" }}; 
var perms = from a in geneticsArray[0] 
      from b in geneticsArray[1] 

      select new { a, b }; 

这给我看所有的选项:

  • MM
  • VM
  • MV
  • VV

这是正确的,但它不是我想达到的目的,因为我的意图和目的VM和MV是一样的。

如何获得转换MV到VM?

这个例子非常简单,只包含2个分组,有可能的无限分组,这是我稍后会处理的事情,但只是想让你知道,所以答复不是简单地反转结果。

任何帮助,这将是伟大的。

进一步编辑

用下面的代码,我可以看到每个排列的计数:

var permCounts = from perm in perms group perm by perm into b select new { b.Key, Count = b.Count() }; 

这将告诉我的每一个上述提到的选项出现一次,这是不完全正确,如上所述,MV和MV在这种情况下是相同的。我需要代码来理解这一点。

这是我正在寻找,而不是如何使它能够处理未知数量的组合。

感谢

+0

看一看这个项目,该项目涵盖了许多permutation-和组合的要求:http://www.codeproject.com/Articles/26050/Permutations-Combinations-and-Variations-using-CG – 2012-04-17 11:53:53

+0

您的代码没有按没有任何意义。我不会编译,因为'e,f,g,h',即使它编译了,它也不会工作,因为你超出了数组的界限。 – svick 2012-04-17 12:04:30

+0

@svick谢谢你指出,我从一个更大的工作示例复制并粘贴它,代码现在是正确的 – JamesStuddart 2012-04-17 12:09:55

回答

1

这个怎么样?

 var perms = from a in geneticsArray[0] 
        from b in geneticsArray[1] 

        select new string[] { a, b }; 

     var dict = new Dictionary<string, int>(); 
     foreach (var ent in perms) 
     { 
      Array.Sort(ent); 
      var _ent = string.Join(",", ent); 
      if (dict.ContainsKey(_ent)) 
      { 
       dict[_ent]++; 
      } 
      else 
      { 
       dict.Add(_ent, 1); 
      } 
     } 

     return dict; 
0

这样做,我们招:

var geneticsArray = new[] { new[] { "M", "V" }, new[] { "M", "V" } }; 
var perms = from a in geneticsArray[0] 
      from b in geneticsArray[1] 
      where a.CompareTo(b) >= 0 
      select new { a, b }; 

而且很容易与不同大小的名单工作使用递归(看看这个帖子由埃里克利珀 - http://ericlippert.com/2010/06/28/computing-a-cartesian-product-with-linq/

+0

示例代码已更新,现在将编译...复制和粘贴错误:( – JamesStuddart 2012-04-17 12:15:47

+0

埃里克的Linq解决方案非常好;我推荐使用它。 – 2012-04-17 12:24:41

+0

请参阅更多编辑 – JamesStuddart 2012-04-17 12:35:03