C# 使用查找或字典表示C中的一手牌#

C# 使用查找或字典表示C中的一手牌#,c#,dictionary,lookup,C#,Dictionary,Lookup,如果已经有类似的问题,我道歉。那里 有几个关于得分手的问题,但我不需要 我正在做的项目有10张卡片,需要报告结果 最佳5张手牌(“直牌”、“高牌”、“同花顺牌” 等等)。幸运的是,真正的牌是什么并不重要,我只是 我需要一个名字 我已经分析和整理了所有的卡片,并进行了测试 为了所有可能的人手。我现在只需要一个方便的 储存双手的方法。我的mad方法如下,使用伪代码 条款: 我希望有一个水平的动态列表,我可以按照从高到低的顺序填充卡片的数值。对于 例如,“Q J T 7 4 2 1”。T是10。值的副

如果已经有类似的问题,我道歉。那里 有几个关于得分手的问题,但我不需要

我正在做的项目有10张卡片,需要报告结果 最佳5张手牌(“直牌”、“高牌”、“同花顺牌” 等等)。幸运的是,真正的牌是什么并不重要,我只是 我需要一个名字

我已经分析和整理了所有的卡片,并进行了测试 为了所有可能的人手。我现在只需要一个方便的 储存双手的方法。我的mad方法如下,使用伪代码 条款:

我希望有一个水平的动态列表,我可以按照从高到低的顺序填充卡片的数值。对于 例如,“Q J T 7 4 2 1”。T是10。值的副本将被删除 忽略。接下来,我希望这些值下面都有一个 甲板上存在的每种价值的套装列表。例如 J将有一个值为“dh”的子列表来表示我的 钻石杰克和红心杰克。

我相信这是处理这些卡片最优雅的方式, 因为大多数扑克手只处理价值观,而我没有 担心同一价值的牌排成一行,比如说直牌 测试。然后,这两个测试可以很容易地解决诉讼问题 通过参考键下的值进行测试

深呼吸,快到了

因此,一个查找实例似乎是完美的!它有确切的“一” 我想要的“多值键”结构。然而,事实并非如此 请允许我边走边加衣服。我必须把它们全部加起来 因为列表在输入后是不可变的

所以我也

  • 在我查找之前,我必须一次找到所有的西装
  • 以某种方式将值添加到查找列表或
  • 用别的东西
  • 对这些有什么想法吗

    更新 TL;SPARKNOTES博士版本:如何向查找中的键添加更多值?

    *IMOPRTANT NOTE:*此程序的输出应该是一个字符串,其中包含可能的最高一手的名称,例如“一类四个”、“两对”或“高级卡”

    我找到了一个解决方案(不幸的是,我丢失了链接,无法再次找到),他们建议用新列表重新创建整个查找。可能只是我,但我发现解决方案非常。。。丑陋的。。。无论如何,我探索或测试过的其他几种解决方案包括:


    方法1 滚动并使用与每个值关联的套装填充另一个数组。基本上(在这次的实际伪代码中>\u>):

  • 创建ArrayList数组(数组1)
  • 遍历已排序的“卡片”字符串数组(数组2)
  • 对于每张卡:
  • 在字符串索引[1](表示套装)处获取字符,并在从字符串索引[0]提取的索引号处添加到数组1中的ArrayList中
  • 这样,我就有了我想要的相关西装的价值清单。而西服列表是引导的最小尺寸,使得以后的迭代更容易。通过一些额外的步骤,我甚至可以使伞形数组成为一个ArrayList,并按顺序用卡片值填充它,这样就没有间隙,也没有重复的数字。这将给我留下一系列我想要的东西。要明确的是,这不是家庭作业。然而,这是我的室友在过去完成的一个编码类项目,这就是为什么我有这样的限制和要求。我问过的另一个人告诉我,SE在这个时候会被这些家庭作业问题困扰,所以我理解你的怀疑。这是一个个人项目,因为我想学习C#(我现在只知道Java,我喜欢在C#方法中传递参数指针的声音,而Java不这样做)

    如果它是一个等级,我会在那里结束,因为它是有效的。但我真的不喜欢ArrayList中的ArrayList,它们看起来很凌乱。所以我想知道是否还有其他方法


    方法2 我还考虑过简单地处理不可避免地出现的重复项。例如,下面是我的笔直测试:

     for (int i = 0; i < 5; i++)
            {
                int counter = 0;
                for (int j = i; j < i + 4; j++)
                {
                    int secondCard = getValue(cardsArray[j + 1]);
                    int firstCard = getValue(cardsArray[j]);
                    if (secondCard == firstCard)
                    {
                        break;
                    }
                    if (secondCard == (firstCard + 1))
                    {
                        counter++;
                        if (counter == 4)
                        {
                            isStraight = true;
                            return "straight";
                        }
                    }
                }
            }
    
    for(int i=0;i<5;i++)
    {
    int计数器=0;
    对于(int j=i;j
    此代码不起作用。它需要在某个地方或其他地方进行一些调整才能完全工作,但我想在尝试修复它之前分析一下它是否值得。不过,它确实能准确地测试直线。还有几个注意事项:firstCard和secondCard是为了可读性和调试目的而存在的,isStraight是为了以后在测试直接刷新时不会重新发明轮子

    这个嵌套循环将遍历所有卡片,直到第五张卡片为止(因为你不能直接从十张排序的卡片中选出少于5张卡片),然后按照你的预期检查接下来的五张卡片。如果在这个迭代过程中,我遇到了一个重复条目,这意味着它是另一套衣服的同一张牌,我只是“打破”。这一语句的结果是,现在我们将第二次迭代增加了一次,以检查下一张卡,而不是当前卡。我们拥有的订单卡的数量将保持不变,以便列表
        static void StackOverflowExample()
        {
            var cardList = new List<KeyValuePair<string,int>> ()
            {
                new KeyValuePair<string, int>("Club", 8),
                new KeyValuePair<string, int>("Spade", 9),
                new KeyValuePair<string, int>("Heart", 10)
            };
    
            var results = cardList.Where(p => p.Key == "Heart");
        }
    
    Ace of Hearts = 0
    Two of Hearts = 1
    Three of Hearts = 2
    ...
    Queen of Hearts = 11
    King of Hearts = 12
    Ace of Diamonds = 13
    ...
    ...
    Ace of Clubs = 26
    ...
    ...
    Kind of Spades = 51
    
    int[] cardsArray = new int[10];
    // here, fill the cards array from the input
    
    int[] sortedBySuit = 
        cardsArray
        .OrderBy(x => x/13)  // sorts by suit
        .ThenByDescending(x => x % 13) // then by value, descending
        .ToArray();
    
    int[] sortedByValue =
        cardsArray
        .OrderByDescending(x => x % 13)
        .ToArray();