c# 对扑克牌进行排序
c# sort hand of playing cards
我有一张 class 具有以下属性的卡片
public int value { get; private set; }
public string suit { get; private set; }
一旦我的玩家有牌
List<Card> hand
我如何对那手牌进行排序,以便
1) 主要按花色分类,最大(牌数最多)组在前,最小(牌数最少)组最后,
2) 将这些组从高到低排序
此外,这是给 Rook 的 - 几乎与扑克牌相同。值范围从 1 到 14,有四种花色 - 红色、绿色、黄色和黑色。此外,还有一张"Rook"卡。请注意,以防这会改变任何事情。
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);
如果你想变得更漂亮,你可以用 SortOrder
把 suit
变成它自己的类型。这将使您可以完全控制带有特殊花色的卡片。
class Suit
{
public string Name { get; set; }
public int SortOrder { get; set; }
}
或者,作为枚举:
enum Suit
{
Hearts = 1, //1 = sort order
Clubs = 2,
//...
Rook = 5,
}
创建 4 个链表(每个花色一个)并将每张牌插入链表中的相关位置(从最高到最低)并为每个列表保存一个计数器。根据计数器,您将知道每套花色有多少张牌,并且它们将被分类。只需将它们复制到完成的数组即可。
var sorted = hand
.GroupBy(l => l.Suit)
.OrderByDescending(g => g.Count())
.SelectMany(g => g.OrderByDescending(c => c.Value));
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")));
我有一张 class 具有以下属性的卡片
public int value { get; private set; }
public string suit { get; private set; }
一旦我的玩家有牌
List<Card> hand
我如何对那手牌进行排序,以便
1) 主要按花色分类,最大(牌数最多)组在前,最小(牌数最少)组最后,
2) 将这些组从高到低排序
此外,这是给 Rook 的 - 几乎与扑克牌相同。值范围从 1 到 14,有四种花色 - 红色、绿色、黄色和黑色。此外,还有一张"Rook"卡。请注意,以防这会改变任何事情。
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);
如果你想变得更漂亮,你可以用 SortOrder
把 suit
变成它自己的类型。这将使您可以完全控制带有特殊花色的卡片。
class Suit
{
public string Name { get; set; }
public int SortOrder { get; set; }
}
或者,作为枚举:
enum Suit
{
Hearts = 1, //1 = sort order
Clubs = 2,
//...
Rook = 5,
}
创建 4 个链表(每个花色一个)并将每张牌插入链表中的相关位置(从最高到最低)并为每个列表保存一个计数器。根据计数器,您将知道每套花色有多少张牌,并且它们将被分类。只需将它们复制到完成的数组即可。
var sorted = hand
.GroupBy(l => l.Suit)
.OrderByDescending(g => g.Count())
.SelectMany(g => g.OrderByDescending(c => c.Value));
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")));