繁体   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