HI,我正在开发一个简单的类来组合任何类型的项目...这是一个扑克游戏,这就是它的外观:
public static List<List<T>> combinar<T>(List<T> items, int take)
{
List<List<T>> combs = new List<List<T>>();
var stuff = permutar<T>(items, take);
var all = from s in stuff
select new Tuple<List<T>, string>(s, String.Join("", s.OrderBy(c => c).Select(c => c.ToString())));
var strs = all.Select(s => s.Item2).Distinct();
foreach (var str in strs)
{
combs.Add(all.First(a => a.Item2 == str).Item1);
}
return combs;
}
public static List<List<T>> permutar<T>(List<T> list, int take)
{
List<List<T>> combs = new List<List<T>>();
foreach (var item in list)
{
var newlist = list.Where(i => !i.Equals(item)).ToList();
var returnlist = take <= 1 ? new List<List<T>> { new List<T>() } : permutar(newlist, take - 1);
foreach (var l in returnlist)
{
l.Add(item);
}
combs.AddRange(returnlist);
}
return combs;
}
所以排列工作得很完美..但是我在组合方面有些麻烦,当T是卡时需要很多时间才能完成...所以我的问题是如何选择不同的列表形成排列的结果???
这是卡类:
public class Card : IComparable
{
Suite _Suite;
public Suite Suite
{
get { return _Suite; }
set { _Suite = value; }
}
Grade _Grade;
public Grade Grade
{
get { return _Grade; }
set { _Grade = value; }
}
string _symbol;
public string Symbol
{
//stuff
}
public PictureBox Picture
{
//stuff
}
public override string ToString()
{
return _Grade.ToString() + " " + _Suite.ToString();
}
public int CompareTo(object obj)
{
Card card = (Card)obj;
return card.Grade > this.Grade ? -1 : card.Grade < this.Grade ? 1 : 0;
}
}
答案 0 :(得分:1)
假设您不想进行任何大的算法更改,那么您最大的问题是
combs.Add(all.First().Item1);
这没有任何意义。也许你的意思是
combs.Add(all.First(c => c.Item2 == str)).Item1);
然而,这将是非常缓慢的;如果这是您想要的,您应该将all
的结果放入由字符串键入的哈希表中,并使用它而不是循环遍历Distinct
结果。
如果你想首先获得没有计算排列的组合,那么这样做的方法就是这样。给定一些对象,找到长度为K的组合:如果K为0,则返回空列表。否则,对于每个对象,取该对象,然后以递归方式附加其余对象的所有K-minus-1长度组合。