考虑这个 List<string>
List<string> data = new List<string>();
data.Add("Text1");
data.Add("Text2");
data.Add("Text3");
data.Add("Text4");
我遇到的问题是:如何获得列表子集的每个组合?
有点像这样:
#Subset Dimension 4
Text1;Text2;Text3;Text4
#Subset Dimension 3
Text1;Text2;Text3;
Text1;Text2;Text4;
Text1;Text3;Text4;
Text2;Text3;Text4;
#Subset Dimension 2
Text1;Text2;
Text1;Text3;
Text1;Text4;
Text2;Text3;
Text2;Text4;
#Subset Dimension 1
Text1;
Text2;
Text3;
Text4;
我想出了一个不错的解决方案,值得在这里分享。
最佳答案
我认为,这个问题的答案需要一些性能测试。我试一试。它是社区维基,随时更新。
void PerfTest()
{
var list = Enumerable.Range(0, 21).ToList();
var t1 = GetDurationInMs(list.SubSets_LB);
var t2 = GetDurationInMs(list.SubSets_Jodrell2);
var t3 = GetDurationInMs(() => list.CalcCombinations(20));
Console.WriteLine("{0}\n{1}\n{2}", t1, t2, t3);
}
long GetDurationInMs(Func<IEnumerable<IEnumerable<int>>> fxn)
{
fxn(); //JIT???
var count = 0;
var sw = Stopwatch.StartNew();
foreach (var ss in fxn())
{
count = ss.Sum();
}
return sw.ElapsedMilliseconds;
}
输出:
1281
1604 (_Jodrell not _Jodrell2)
6817
Jodrell 的更新
我已经建立了 Release模式,即优化。当我通过 Visual Studio 运行时,我没有在 1 或 2 之间得到一致的偏差,但是在重复运行 LB 的答案之后,我得到的答案接近于类似的东西,
1190
1260
more
但是如果我从命令行运行测试工具,而不是通过 Visual Studio,我会得到更像这样的结果
987
879
still more
关于c# - 如何获得子集的所有可能组合?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13765699/