【问题标题】:Two variables in one foreach一个 foreach 中的两个变量
【发布时间】:2014-04-01 16:56:30
【问题描述】:

我正在尝试在控制台标准纸牌上打印。到目前为止,这是我的代码,我被卡住了。

我的问题——有没有办法在 cardnumber foreach 语句中使用 Suit 枚举,基本上可以打印卡号/花色、卡号/花色等。我知道有更好的方法可以做到这一点,但我很好奇是否有可能完成。还有任何想法如何在一行上只打印 2 个,然后在一行上只打印 3 个等等?

问候

using System;
using System.Linq;

class Print_a_Deck_of_52_Card   
{

public enum Suit
{
    Club = '\u2663',
    Diamond = '\u2666',
    Heart = '\u2665',
    Spades = '\u2660',
}

public enum CardNumber
{

    Two = 2,
    Three = 3,
    Four = 4,
    Five = 5,
    Six = 6,
    Seven = 7,
    Eight = 8,
    Nine = 9,
    Ten = 10,
    J = 11,
    Q = 12,
    K = 13,
    A = 14
}

static void Main()
{
    Console.OutputEncoding = System.Text.Encoding.Unicode;

    foreach (Suit val1 in Enum.GetValues(typeof(Suit)))
        foreach (CardNumber val in Enum.GetValues(typeof(CardNumber)))
        {
            for (int i = 0; i < 4; i++)
            {
                if ((int)val > 10)
                {

                    Console.WriteLine("{0}", val);
                }
                else
                {

                    Console.WriteLine("{0}", (int)val);

                }
            }

        }

}

}

【问题讨论】:

    标签: c# foreach enums console playing-cards


    【解决方案1】:

    是的,您可以在foreach 循环体中的任何位置使用迭代器变量,即使该循环包含另一个循环:

    foreach (Suit val1 in Enum.GetValues(typeof(Suit)))
    {
        foreach (CardNumber val in Enum.GetValues(typeof(CardNumber)))
        {
            if ((int)val > 10)
            {
                Console.WriteLine("{0} of {1}", val, val1);
            }
            else
            {
                Console.WriteLine("{0} of {1}", (int)val, val1);
            }
        }
    }
    

    现在,如果你想重写它,让所有的 2 一起打印,然后是 3,以此类推,只需交换循环即可:

    foreach (CardNumber val in Enum.GetValues(typeof(CardNumber)))
    {
        foreach (Suit val1 in Enum.GetValues(typeof(Suit)))
        {
            if ((int)val > 10)
            {
                Console.WriteLine("{0} of {1}", val, val1);
            }
            else
            {
                Console.WriteLine("{0} of {1}", (int)val, val1);
            }
        }
    }
    

    要将它们写成一行,您可以使用Write 而不是在循环内将每个值保持在一起,然后在循环外使用WriteLine 将该行与下一行分开:

    foreach (CardNumber val in Enum.GetValues(typeof(CardNumber)))
    {
        foreach (Suit val1 in Enum.GetValues(typeof(Suit)))
        {
            if ((int)val > 10)
            {
                Console.Write("{0} of {1}", val, val1);
            }
            else
            {
                Console.Write("{0} of {1}", (int)val, val1);
            }
        }
    
        Console.WriteLine();
    }
    

    【讨论】:

    • 如此简单...在过去的一个小时里一直困扰着我,我就是想不通。也许有时休息一下是个好主意。非常感谢!只有一个问题 - 它在每一行添加“of”,我猜它是在您使用枚举时内置的功能。有什么办法可以去掉吗?
    • @tslid 啊不,我就是这么写的(我以为你想要像 "2 of Spades" 这样的东西)。只需从Console.Write 中的格式字符串中删除“of”即可。
    • 哦,根本没有注意到添加的 :) 我认为 typeoff 以某种方式添加了它。我还有很多东西要学,但感谢您的快速回复!
    猜你喜欢
    • 2013-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-07
    • 2016-01-01
    相关资源
    最近更新 更多