Как выбрать отдельные списки <T>из списка? - PullRequest
0 голосов
/ 30 июля 2010

Привет, я работаю над простым классом для объединения предметов любого типа ... это для игры в покер, вот как это выглядит:

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;
    }
}

1 Ответ

1 голос
/ 30 июля 2010

Если вы не хотите вносить какие-либо большие алгоритмические изменения, ваша самая большая проблема здесь

combs.Add(all.First().Item1);

Это не имеет никакого смысла.Возможно, вы имели в виду

combs.Add(all.First(c => c.Item2 == str)).Item1);

Однако это будет очень медленно;если это то, что вам нужно, вы должны поместить результаты all в хеш-таблицу, заданную строкой, и использовать ее вместо циклического просмотра результатов Distinct.

Если вы хотите получать комбинации без вычисленийСначала перестановки, способ сделать это будет так.Учитывая некоторые объекты, найти комбинации длины K: если K равно 0, вернуть пустой список.Иначе, для каждого объекта возьмите этот объект, а затем рекурсивно добавьте все комбинации длины K-минус 1 к остальным объектам.

...