如何按属性值计算对象?

时间:2013-06-03 21:10:50

标签: c# algorithm sorting count grouping

第1部分。我有一个名为Cards的对象。它具有Name,Suit和Value属性(Jack,Diamonds,2)。我想算一个玩家是否有四种类型(4张牌具有相同的Name属性)。如何实现这一目标?我正在寻找一种有效的算法。

第2部分。我需要一种算法,用于在同一套装的行中找到5张卡片(即7,8,9,10,心形插孔)。非常感谢你们所有聪明的人!

为了澄清,每位玩家共获得8张牌。 Player(对象)有一个名为Hand的属性,它是Cards [object]的列表。

1 个答案:

答案 0 :(得分:3)

对于第1部分,您可以这样做:

var has4ofaKind = cards.GroupBy(c => c.Name).Any(g => g.Count() >= 4);

对于第2部分,如果你将一个属性(比如Value)作为整数而不是字符串,那将会容易得多。然后你可以这样做:

var firstSuit = cards.First.Suit();
var isFlush = cards.Skip(1).All(c => c.Suit == firstSuit);
var isStraight = !cards.OrderBy(c => c.Value)
                       .Select((c, i) => c.Value - i)
                       .Distinct().Skip(1).Any();
var isStraightFlush = isFlush && isStraight;

注意这假设一手牌是5张牌。要在8手牌中找到5张牌的直线/同花,你必须使用以下内容:

var hasFlush = cards.cards.GroupBy(c => c.Suit).Any(g => g.Count() >= 5);
var hasStraight = !cards.OrderBy(c => c.Value)
                        .Select((c, i) => c.Value - i)
                        .GroupBy(x => x)
                        .Any(g => g.Count() >= 5);

要找到同花顺是稍微复杂一点:

var hasStraightFlush= !cards.OrderBy(c => c.Value)
                            .Select((c, i) => new { x = c.Value - i, c.Suit })
                            .GroupBy(x => x)
                            .Any(g => g.Count() >= 5);