Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何按属性值计算对象数?_C#_Algorithm_Sorting_Count_Grouping - Fatal编程技术网

C# 如何按属性值计算对象数?

C# 如何按属性值计算对象数?,c#,algorithm,sorting,count,grouping,C#,Algorithm,Sorting,Count,Grouping,第一部分。我有一个叫做卡片的东西。它有名字,西装和价值属性(杰克,钻石,2)。我想计算一个玩家是否有四张同类牌(四张牌有相同的名字属性)。如何做到这一点?我在寻找一个有效的算法 第二部分。我需要一个算法,在同一套衣服的一行中找到5张牌(即7、8、9、10、红心杰克)。非常感谢你们所有的聪明人 为了澄清,每位玩家总共得到8张牌。玩家(对象)有一个名为“手”的属性,它是一张牌列表[对象] 对于第1部分,您可以执行以下操作: var has4ofaKind = cards.GroupBy(c =>

第一部分。我有一个叫做卡片的东西。它有名字,西装和价值属性(杰克,钻石,2)。我想计算一个玩家是否有四张同类牌(四张牌有相同的名字属性)。如何做到这一点?我在寻找一个有效的算法

第二部分。我需要一个算法,在同一套衣服的一行中找到5张牌(即7、8、9、10、红心杰克)。非常感谢你们所有的聪明人


为了澄清,每位玩家总共得到8张牌。玩家(对象)有一个名为“手”的属性,它是一张牌列表[对象]

对于第1部分,您可以执行以下操作:

var has4ofaKind = cards.GroupBy(c => c.Name).Any(g => g.Count() >= 4);
对于第2部分,如果您有一个属性,比如说
,作为整数而不是字符串,那就容易多了。然后你可以这样做:

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

对于第1部分:玩家有什么数据结构?也就是说,如何表示玩家的牌集合?第二部分:从什么中找出5张牌?你是说找出玩家的手牌是否有5张牌?谢谢。每位玩家总共得到8张牌。玩家对象有一个手属性,它是一张牌的列表。希望我回答了你的问题。我还将更新问题以使其更清楚。@pnduke您是否有一些代码要发布,或者希望我们为您编写所有内容?要确定一名玩家是否连续拥有5张牌,您可以为每张牌分配一个int值。Ace=1,number cards=number value,jack=11,queen=12,king=13。然后,您可以对这些卡进行排序,以确定手牌中的最低卡值,然后确定下一个值的卡是否也在手牌中,在一个运行5次的循环中。如果你得到了一个不在手上的值,你就打破了循环,如果你到达终点,你就有了一次跑步。另外,既然你有8张牌,你就必须在接下来的3张最低的牌上重复这一点,以确保你不会有一张开局更高的牌。一定要喜欢林克。回答得好