数组中数组的排列

时间:2012-04-17 11:44:25

标签: c# arrays linq multidimensional-array

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

我有这个工作,到了一点

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的概述是相同的。我需要代码来理解这一点。

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

由于

2 个答案:

答案 0 :(得分: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;

答案 1 :(得分: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 };

使用递归更容易处理不同大小的列表(请看Eric Lippert的这篇文章 - http://ericlippert.com/2010/06/28/computing-a-cartesian-product-with-linq/