簡體   English   中英

c#中列表中的對數和最大值

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM