我正在开发一个项目,我需要找到一个数组的所有可能的排列。
我有这个工作,到了一点
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 };
这为我提供了所有选择:
哪个是正确的,但这不是我想要实现的目标,因为我的意图和目的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 :(得分: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/)