如何解决C#中列表的对数和最大值
扑克游戏卡表示如下
public class Card
{
public string Rank { get; set; }
public int Value { get; set; }
public char Suit { get; set; }
}
从卡列表中,我必须找到对数和最大对数。对中的值
样本值
[
{ "A",14,'D' }
{ "A",'H' }
{ "T",10,'D' }
{ "T",'S' }
{ "5",5,'S' }
]
在这种情况下2对[1对A和1对T,最大值为14]
样本值
[
{ "K",13,'D' }
{ "K",'H' }
{ "2",2,'S' }
]
在这种情况下,只有1对K,最大值为13
我在LINQ下面使用了对数
var pairs_list = hand
.GroupBy(i => i.Rank)
.Where(g => g.Count() > 1)
.Select(g => g.Key);
通过这种linq来获取最高对的值的任何方法,或者我们可以做一个查询来查找对中没有对和最大值(如果有)的最大值
解决方法
通过这种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,p2.index));
Console.WriteLine($" Pair Count: {result.count},Max Value: {result.value}");
,
您可以添加类结果:
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,Value = 13,Suit = 'S' },new Card { Rank = "5",Value = 5,};
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; }
}
希望您对此有帮助。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。