[英]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.