所以我是C#的新手,我已经完成了以下任务:
我有一个身份不明的人数清单(例如5人)。任务是获取列表中此人与之后的人不能在同一组中的人群。
例如:5人
{1},{2},{3},{4},{5},{1,3},{1,4},{1,5},{2,4},{2,5}, {3,5},{1,3,5}
我从http://www.codeproject.com/Articles/26050/Permutations-Combinations-and-Variations-using-CG链接中使用了组合方法,并且我有此代码
private void button3_Click(object sender, EventArgs e)
{
outputBox.Clear();
int nr = Convert.ToInt32(nmbrBox.Value);
double tmp = Math.Pow(2, nr);
double combs = tmp - 1;
List<int> list = new List<int>();
for (int i = 1; i <= nr; i++ )
{
list.Add(i);
}
outputBox.AppendText(combs.ToString() + " combinari\n\n");
List<string> allCombinations = new List<String>();
for (int i = 1; i <= list.Count; i++)
{
var combis = new Facet.Combinatorics.Combinations<int>(list, i, Facet.Combinatorics.GenerateOption.WithoutRepetition);
allCombinations.AddRange(combis.Select(c => string.Join("", c)));
}
foreach (var combi in allCombinations)
{
outputBox.AppendText(combi + "\n");
}
}
如何使它只显示我想要的结果?
我可以提供一个简单的解决方案。考虑到您的group
字符串格式为“ 1 2 3”或“ 1”或“ 1 2”,因此allCombinations中的foreach组使用如下验证方法:
public static bool IsGroupValid(string group)
{
var indexes= group.Split(' ').Select(x=>Int32.Parse(x)).ToList();
for (int i = 0; i < indexes.Count; i++)
{
if (indexes.Any(x=>x+1==indexes[i]))
return false;
}
return true;
}
所以看起来像这样:
foreach (var combi in allCombinations)
{
if(IsGroupValid(combi))
outputBox.AppendText(combi + "\n");
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句