我一直在寻找一种方法,以3个组的形式获得List的所有独特排列。我发现了很多下载的源代码和复杂的算法。
我终于想出了自己的代码,似乎有用。有人可以告诉我为什么以下不是一个好主意。我假设由于我发现的所有复杂的解决方案,我必须要忽略一些东西,而且我的看似太简单了。
var combinations = from a in Samples
from b in Samples
from c in Samples
where (string)a.sample != (string)b.sample
&& (string)a.sample != (string)c.sample
&& (string)b.sample != (string)c.sample
select new Rank
{
sample = a.sample,
sampleb = b.sample,
samplec = c.sample
};
foreach (var combo in combinations)
{
string[] aut = { combo.sample, combo.sampleb, combo.samplec };
Array.Sort(aut);
combo.sample = aut[0];
combo.sampleb = aut[1];
combo.samplec = aut[2];
l.Add(combo);
}
noDupes = from n in l
group n by new { n.sample, n.sampleb, n.samplec } into g
select new Rank
{
sample = g.Key.sample,
sampleb = g.Key.sampleb,
samplec = g.Key.samplec
};
答案 0 :(得分:1)
您正在添加所有内容,然后删除重复内容。你不需要,看看关于排列的这个(我的)答案:https://stackoverflow.com/a/9315076/360211
应用于您的方案,您有一个3位数字(maxDigits = 3
),其中base = Samples.Count()
如果你的代码已经有效,那么这种方法的优点只与性能有关。