[英]number of pairs and max value from a list in c#
扑克游戏卡表示如下
public class Card
{
public string Rank { get; set; }
public int Value { get; set; }
public char Suit { get; set; }
}
从卡片列表中,我必须找到对数和最大值。 对的价值
样本值
[
{ "A" , 14, 'D' }
{ "A" , 14, 'H' }
{ "T" , 10, 'D' }
{ "T" , 10, 'S' }
{ "5" , 5, 'S' }
]
在这种情况下 2 对 [ 1 对 A 和 1 对 T 并且最大值为 14 ]
样本值
[
{ "K" , 13, 'D' }
{ "K" , 13, 'H' }
{ "2" , 2, 'D' }
{ "T" , 10, 'S' }
{ "5" , 5, 'S' }
]
在这种情况下,只有一对 K,最大值为 13
我在 LINQ 下面使用了查找对的数量
var pairs_list = hand
.GroupBy(i => i.Rank)
.Where(g => g.Count() > 1)
.Select(g => g.Key);
使用此 linq 获取最高对的值的任何方法,或者我们可以进行单个查询以从对中查找对的数量和最大值 ifany
使用此 linq 获得最高对值的任何方法
你真的很接近你的代码。 您已经选择了手中所有成对的等级,所以剩下要做的就是只选择最大的值。
但是,您应该根据整数Value
而不是字符串Rank
进行分组,因为使用整数更容易找到“更大的值”。
int largestPairRankInHand = hand
.GroupBy(card => card.Value)
.Where(g => g.Count() > 1)
.Select(g => g.Key)
.OrderByDescending(val => val)
.FirstOrDefault();
OrDefault
以防万一您手中没有物品。
这是一个小提琴示例: https : //dotnetfiddle.net/5Vo45H
var result = hand
.GroupBy(i => i.Rank)
.Where(g => g.Count() > 1)
.Select((g, i) => (value: g.First().Value, index: i + 1))
.Aggregate((value: 0, count: 0), (p1, p2) => p1.value > p2.value ? (p1.value, p2.index) : (p2.value, p2.index));
//// or
// var result = hand
// .GroupBy(i => i.Value)
// .Where(g => g.Count() > 1)
// .Select((g, i) => (value: g.Key, index: i + 1))
// .Aggregate((value: 0, count: 0), (p1, p2) => p1.value > p2.value ? (p1.value, p2.index) : (p2.value, p2.index));
Console.WriteLine($" Pair Count: {result.count}, Max Value: {result.value}");
您可以添加类Result ,如:
public class Result
{
public int NoRanks { get; set; }
public int MaxValue { get; set; }
}
并稍微更改您的代码,例如:
var pairsList = hand
.GroupBy(card => card.Rank)
.Where(g => g.Skip(1).Any())
.Select(o => new { Rank = o.Key, Value = o.Max(v => v.Value) });
并使用Max函数构建结果,例如:
Result result = new Result
{
NoRanks = pairsList.Count(),
MaxValue = pairsList.Max(o => o.Value)
};
演示: https : //dotnetfiddle.net/GitsRb
public static void Main()
{
var hand = new Card[]
{
new Card { Rank = "A", Value = 9, Suit = 'D' },
new Card { Rank = "A", Value = 10, Suit = 'H' },
new Card { Rank = "T", Value = 12, Suit = 'D' },
new Card { Rank = "T", Value = 13, Suit = 'S' },
new Card { Rank = "5", Value = 5, Suit = 'S' },
};
var pairsList = hand
.GroupBy(card => card.Rank)
.Where(g => g.Skip(1).Any())
.Select(o => new { Rank = o.Key, Value = o.Max(v => v.Value) });
Result result = new Result
{
NoRanks = pairsList.Count(),
MaxValue = pairsList.Max(o => o.Value)
};
Console.WriteLine($"Ranks: {string.Join(",", result.NoRanks )} and max value : {result.MaxValue}");
}
public class Card
{
public string Rank { get; set; }
public int Value { get; set; }
public char Suit { get; set; }
}
public class Result
{
public int NoRanks { get; set; }
public int MaxValue { get; set; }
}
我希望你觉得这有帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.