c#排序扑克牌

时间:2015-07-29 19:59:44

标签: c# sorting playing-cards

我有一张具有以下属性的类卡

public int value { get; private set; }
public string suit { get; private set; }

我有一手牌手

List<Card> hand

如何对那手进行排序,以便

1)主要分为西装,最大(大多数卡)组首先,最小(最少卡)组最后,

2)对这些群体进行排序,从高到低排序

此外,这是为了Rook - 几乎与扑克牌相同。值范围从1到14,有四种套装 - 红色,绿色,黄色和黑色。此外,还有一个&#34; Rook&#34;卡。如果这会改变任何事情,只需要抬头。

4 个答案:

答案 0 :(得分:4)

Linq对排序非常有用:

var sorted = hand
    .GroupBy(x => x.suit)
    .Select(x => new 
    {
        Cards = x.OrderByDescending(c => c.value),
        Count = x.Count(),
    })
    .OrderByDescending(x => x.Count)
    .SelectMany(x => x.Cards);

如果您想获得更高级的感觉,可以使用suitSortOrder变为自己的类型。这样您就可以完全控制带有特殊套装的卡片。

class Suit
{
    public string Name { get; set; }
    public int SortOrder { get; set; }
}

或者,作为枚举:

enum Suit
{
    Hearts = 1, //1 = sort order
    Clubs = 2, 
    //...
    Rook = 5,
}

答案 1 :(得分:2)

var sorted = hand
    .GroupBy(l => l.Suit)
    .OrderByDescending(g => g.Count())
    .SelectMany(g => g.OrderByDescending(c => c.Value));

答案 2 :(得分:1)

创建4个链接列表(每个套装一个)并将每张卡插入链接列表中的相关位置(从最高到最低)并为每个列表保留一个计数器。根据柜台,您将知道每件衣服有多少张卡,他们将被分类。只需将它们复制到完成的数组中即可。

答案 3 :(得分:0)

 hand.Sort((y, x) => (hand.Count(c => c.suit == x.suit).ToString("D2") + x.suit + "/" + x.value.ToString("D2"))
            .CompareTo(hand.Count(c => c.suit == y.suit).ToString("D2") + y.suit + "/" + y.value.ToString("D2")));
相关问题