簡體   English   中英

如何選擇不同的列表 <T> 來自清單 <List<T> &gt;?

[英]How to select distinct List<T>'s from a List<List<T>>?

嗨,我正在研究一個簡單的類來組合任何類型的項目...這是用於撲克游戲,它的外觀如下:

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為Card時,要花很多時間才能完成...所以我的問題是如何從排列的結果中選擇不同的列表?

這是卡類:

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

假設您不想進行任何大的算法更改,那么這里最大的問題是

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

那沒有任何意義。 也許你是說

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

但是,那將非常慢。 如果這是您想要的,則應將all結果放入以該字符串為鍵的哈希表中,並使用該結果而不是遍歷Distinct結果。

如果您想在不首先計算排列的情況下獲得組合,則這樣做的方式將是這樣。 給定一些對象,以查找長度為K的組合:如果K為0,則返回空列表。 否則,對於每個對象,獲取該對象,然后遞歸地附加其余對象的所有K--1長度組合。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM