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

这为我提供了所有选项:

  • 毫米
  • 虚拟机
  • MV
  • 维维

这是正确的,但这不是我想要实现的,因为我的意图和目的 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 的概述是相同的。我需要代码来理解这一点。

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

谢谢

4

2 回答 2

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;
于 2012-04-17T13:35:32.030 回答
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/ )

于 2012-04-17T12:12:30.067 回答