首页 > 解决方案 > 在控制台应用程序中使用数字和字母创建一个 16x26 的网格

问题描述

我正在尝试在控制台应用程序中创建一个 16x26 的网格,就像我在标题中所说的那样,但我什至无法将数字和字母放在正确的位置。然后我必须使用列和线将 unicode 字符像地图一样创建网格。它就像一个矩阵,在字母和数字内部是 unicode 字符。

有人可以帮助我吗,我是新手。

这就是我所做的:

static void Main(string[] args)
{
        char y;  
        int x, letra;

        for (int j = 0; j < 16; j++)
        {
            for (int i = 0; i < 26; i++)
            {
                if (j==0 && i==0 || i == 1)
                {
                    Console.Write(" ");
                }
                else if(j==0 && i > 1)
                {
                    letra = 65 + i;
                    y = Convert.ToChar(letra);
                    Console.Write(y + " ");
                }
                else if(i==0 && j > 1)
                {
                    x = 1 + j;
                    Console.WriteLine(" ", x);
                }
                else if(j % 2 == 0 && j != 0 && i == 0)
                {
                    Console.WriteLine(x + "");
                }
                
            }
        }
}

标签: c#consoleconsole-application

解决方案


This little demo app may help you get where you're hoping to be:

static void Main(string[] args)
{
    var numberOfRows = 16;
    var numberOfCols = 26;
    for (var currentRow = 0; currentRow < numberOfRows; currentRow++)
    {
        for (var currentCol = 0; currentCol < numberOfCols; currentCol++)
        {
            Console.Write(" ({0:00}, {1:00})", currentRow, currentCol); //for each column in the current row, output some data (in this case, the coordinates of this cell formatted " (row, col)"
        }
        Console.WriteLine(); //once we've completed a row, write a new line to move down to the next row
    }
}

Example Output

 (00, 00) (00, 01) (00, 02) (00, 03) (00, 04) (00, 05) (00, 06) (00, 07) (00, 08) (00, 09) (00, 10) (00, 11) (00, 12) (00, 13) (00, 14) (00, 15) (00, 16) (00, 17) (00, 18) (00, 19) (00, 20) (00, 21) (00, 22) (00, 23) (00, 24) (00, 25)
 (01, 00) (01, 01) (01, 02) (01, 03) (01, 04) (01, 05) (01, 06) (01, 07) (01, 08) (01, 09) (01, 10) (01, 11) (01, 12) (01, 13) (01, 14) (01, 15) (01, 16) (01, 17) (01, 18) (01, 19) (01, 20) (01, 21) (01, 22) (01, 23) (01, 24) (01, 25)
 (02, 00) (02, 01) (02, 02) (02, 03) (02, 04) (02, 05) (02, 06) (02, 07) (02, 08) (02, 09) (02, 10) (02, 11) (02, 12) (02, 13) (02, 14) (02, 15) (02, 16) (02, 17) (02, 18) (02, 19) (02, 20) (02, 21) (02, 22) (02, 23) (02, 24) (02, 25)
 (03, 00) (03, 01) (03, 02) (03, 03) (03, 04) (03, 05) (03, 06) (03, 07) (03, 08) (03, 09) (03, 10) (03, 11) (03, 12) (03, 13) (03, 14) (03, 15) (03, 16) (03, 17) (03, 18) (03, 19) (03, 20) (03, 21) (03, 22) (03, 23) (03, 24) (03, 25)
 (04, 00) (04, 01) (04, 02) (04, 03) (04, 04) (04, 05) (04, 06) (04, 07) (04, 08) (04, 09) (04, 10) (04, 11) (04, 12) (04, 13) (04, 14) (04, 15) (04, 16) (04, 17) (04, 18) (04, 19) (04, 20) (04, 21) (04, 22) (04, 23) (04, 24) (04, 25)
 (05, 00) (05, 01) (05, 02) (05, 03) (05, 04) (05, 05) (05, 06) (05, 07) (05, 08) (05, 09) (05, 10) (05, 11) (05, 12) (05, 13) (05, 14) (05, 15) (05, 16) (05, 17) (05, 18) (05, 19) (05, 20) (05, 21) (05, 22) (05, 23) (05, 24) (05, 25)
 (06, 00) (06, 01) (06, 02) (06, 03) (06, 04) (06, 05) (06, 06) (06, 07) (06, 08) (06, 09) (06, 10) (06, 11) (06, 12) (06, 13) (06, 14) (06, 15) (06, 16) (06, 17) (06, 18) (06, 19) (06, 20) (06, 21) (06, 22) (06, 23) (06, 24) (06, 25)
 (07, 00) (07, 01) (07, 02) (07, 03) (07, 04) (07, 05) (07, 06) (07, 07) (07, 08) (07, 09) (07, 10) (07, 11) (07, 12) (07, 13) (07, 14) (07, 15) (07, 16) (07, 17) (07, 18) (07, 19) (07, 20) (07, 21) (07, 22) (07, 23) (07, 24) (07, 25)
 (08, 00) (08, 01) (08, 02) (08, 03) (08, 04) (08, 05) (08, 06) (08, 07) (08, 08) (08, 09) (08, 10) (08, 11) (08, 12) (08, 13) (08, 14) (08, 15) (08, 16) (08, 17) (08, 18) (08, 19) (08, 20) (08, 21) (08, 22) (08, 23) (08, 24) (08, 25)
 (09, 00) (09, 01) (09, 02) (09, 03) (09, 04) (09, 05) (09, 06) (09, 07) (09, 08) (09, 09) (09, 10) (09, 11) (09, 12) (09, 13) (09, 14) (09, 15) (09, 16) (09, 17) (09, 18) (09, 19) (09, 20) (09, 21) (09, 22) (09, 23) (09, 24) (09, 25)
 (10, 00) (10, 01) (10, 02) (10, 03) (10, 04) (10, 05) (10, 06) (10, 07) (10, 08) (10, 09) (10, 10) (10, 11) (10, 12) (10, 13) (10, 14) (10, 15) (10, 16) (10, 17) (10, 18) (10, 19) (10, 20) (10, 21) (10, 22) (10, 23) (10, 24) (10, 25)
 (11, 00) (11, 01) (11, 02) (11, 03) (11, 04) (11, 05) (11, 06) (11, 07) (11, 08) (11, 09) (11, 10) (11, 11) (11, 12) (11, 13) (11, 14) (11, 15) (11, 16) (11, 17) (11, 18) (11, 19) (11, 20) (11, 21) (11, 22) (11, 23) (11, 24) (11, 25)
 (12, 00) (12, 01) (12, 02) (12, 03) (12, 04) (12, 05) (12, 06) (12, 07) (12, 08) (12, 09) (12, 10) (12, 11) (12, 12) (12, 13) (12, 14) (12, 15) (12, 16) (12, 17) (12, 18) (12, 19) (12, 20) (12, 21) (12, 22) (12, 23) (12, 24) (12, 25)
 (13, 00) (13, 01) (13, 02) (13, 03) (13, 04) (13, 05) (13, 06) (13, 07) (13, 08) (13, 09) (13, 10) (13, 11) (13, 12) (13, 13) (13, 14) (13, 15) (13, 16) (13, 17) (13, 18) (13, 19) (13, 20) (13, 21) (13, 22) (13, 23) (13, 24) (13, 25)
 (14, 00) (14, 01) (14, 02) (14, 03) (14, 04) (14, 05) (14, 06) (14, 07) (14, 08) (14, 09) (14, 10) (14, 11) (14, 12) (14, 13) (14, 14) (14, 15) (14, 16) (14, 17) (14, 18) (14, 19) (14, 20) (14, 21) (14, 22) (14, 23) (14, 24) (14, 25)
 (15, 00) (15, 01) (15, 02) (15, 03) (15, 04) (15, 05) (15, 06) (15, 07) (15, 08) (15, 09) (15, 10) (15, 11) (15, 12) (15, 13) (15, 14) (15, 15) (15, 16) (15, 17) (15, 18) (15, 19) (15, 20) (15, 21) (15, 22) (15, 23) (15, 24) (15, 25)

ps. Per ADyson's comment, if you first create an array then wanted to loop through the contents you'd only tweak the approach to output data slightly / like so:

void Main()
{
    var data = new char[,] {{'A','B','C'}, {'D','E','F'}};
    for(var row=0; row<data.GetLength(0); row++)
    {
        for(var col=0; col<data.GetLength(1); col++)
        {
            Console.Write(data[row,col]);
        }
        Console.WriteLine();
    }
}

And you could populate the 2D array with code such as we'd used in the original post, only assigning to the array like so:

static void Main(string[] args)
{
    var numberOfRows = 16;
    var numberOfCols = 26;
    var data = new char[numberOfRows, numberOfCols];
    for (var currentRow = 0; currentRow < numberOfRows; currentRow++)
    {
        for (var currentCol = 0; currentCol < numberOfCols; currentCol++)
        {
            data[currentRow, currentCol] = Convert.ToChar(65 + currentCol);
        }
    }
}

Another option would be to use IEnumerable collections with lambda expressions and foreach loops like so:

void Main()
{

    //populate
    var data = Enumerable.Range(1,16).Select(x => 
        Enumerable.Range(1,26).Select(y => 
            Convert.ToChar(64 + y)
        )
    );

    //output one way
    Console.WriteLine("\r\nMethod 1\r\n");    
    foreach(var row in data)
    {
        foreach(var cell in row)
        {
            Console.Write(cell);
        }
        Console.WriteLine();
    }

    //or another
    Console.WriteLine("\r\nMethod 2\r\n");    
    data.ToList().ForEach(row => {
        row.ToList().ForEach(cell => 
            Console.Write(cell)
        ); 
        Console.WriteLine();
    });

    //or another approach convert each row from a collection of chars to strings separated by spaces, then join all the strings(rows) to one string separated by line breaks
    Console.WriteLine("\r\nMethod 3\r\n");    
    var output = string.Join("\r\n", data.Select(row => 
        string.Join(" ", row.Select(cell => 
            cell.ToString()
        ))
    )); 
    Console.WriteLine(output);
}

Hopefully some of these techniques help to give you some ideas. If you need any explanations or have any issues implementing these for your scenario, please say in the comments and I'll provide additional help as needed.


NB: A good approach when tackling any issue is to break it down into steps, so if you're looking to draw a grid around your data, rather than having one method to do all the work, create different functions for each piece you're looking to achieve; i.e. one to format each row as you want it, another to put those rows into a table, etc.

Here's an example: https://dotnetfiddle.net/Tb0zkV

void Main()
{

    //populate
    var data = Enumerable.Range(1,16).Select(x => 
        Enumerable.Range(1,26).Select(y => 
            Convert.ToChar(64 + y)
        )
    );
    //display
    Console.WriteLine(data.ToTableFormatString());
}

public static class TableCreationExtension
{

    //converts the output of ToTableFormat to a single string
    public static string ToTableFormatString(this IEnumerable<IEnumerable<char>> rows) =>
        string.Join("\r\n", rows.ToTableFormat());

    /* 
        calls other methods to convert the data to the inner table format, then surrounds with a double edged box
        ╔═════╗
        ║inner║
        ║table║
        ║goes ║ 
        ║here ║
        ╚═════╝
        info on required characters here: https://en.wikipedia.org/wiki/Box-drawing_character           
    */
    public static IEnumerable<string> ToTableFormat(this IEnumerable<IEnumerable<char>> rows)
    {
        var rowsAsStrings = rows.ToInnerTableFormat();
        var rowLength = rowsAsStrings.First().Length; //assume that all rows are the same length, so the length of the first equals the length of all others
        //first row of box
        yield return string.Format("╔{0}╗", new string('═', rowLength));
        //each row within the box
        foreach(var row in rowsAsStrings)
        {
            yield return string.Format("║{0}║", row);
        }
        //last row of box
        yield return string.Format("╚{0}╝", new string('═', rowLength));
    }

    /*
        calls other methods to convert each row into a formatted string
        Adds a separator between each row.

        each
        ---------
        row
        ---------
        separated
    */
    public static IEnumerable<string> ToInnerTableFormat(this IEnumerable<IEnumerable<char>> rows)
    {
        bool returnInnerLine = false;
        int rowLength = 0; //assume all rows are the same length
        foreach(var row in rows)
        {
            var formattedRow = row.ToFormattedRow();
            if (returnInnerLine)
            {
                yield return new string('-', rowLength); //returns a line of -s the same length as a row for a between-row separator
            }
            else
            {
                returnInnerLine = true;
                rowLength = formattedRow.Length;
            }
            yield return formattedRow;
        }
    }

    //converts `'A', 'B', 'C'` to "A|B|C" 
    public static string ToFormattedRow(this IEnumerable<char> cellsInRow) =>
        string.Join("|", cellsInRow.Select(c => c.ToString()));
}

Output

+---------------------------------------------------+
¦A|B|C|D|E|F|G|H|I|J|K|L|M|N|O|P|Q|R|S|T|U|V|W|X|Y|Z¦
¦---------------------------------------------------¦
¦A|B|C|D|E|F|G|H|I|J|K|L|M|N|O|P|Q|R|S|T|U|V|W|X|Y|Z¦
¦---------------------------------------------------¦
¦A|B|C|D|E|F|G|H|I|J|K|L|M|N|O|P|Q|R|S|T|U|V|W|X|Y|Z¦
¦---------------------------------------------------¦
¦A|B|C|D|E|F|G|H|I|J|K|L|M|N|O|P|Q|R|S|T|U|V|W|X|Y|Z¦
¦---------------------------------------------------¦
¦A|B|C|D|E|F|G|H|I|J|K|L|M|N|O|P|Q|R|S|T|U|V|W|X|Y|Z¦
¦---------------------------------------------------¦
¦A|B|C|D|E|F|G|H|I|J|K|L|M|N|O|P|Q|R|S|T|U|V|W|X|Y|Z¦
¦---------------------------------------------------¦
¦A|B|C|D|E|F|G|H|I|J|K|L|M|N|O|P|Q|R|S|T|U|V|W|X|Y|Z¦
¦---------------------------------------------------¦
¦A|B|C|D|E|F|G|H|I|J|K|L|M|N|O|P|Q|R|S|T|U|V|W|X|Y|Z¦
¦---------------------------------------------------¦
¦A|B|C|D|E|F|G|H|I|J|K|L|M|N|O|P|Q|R|S|T|U|V|W|X|Y|Z¦
¦---------------------------------------------------¦
¦A|B|C|D|E|F|G|H|I|J|K|L|M|N|O|P|Q|R|S|T|U|V|W|X|Y|Z¦
¦---------------------------------------------------¦
¦A|B|C|D|E|F|G|H|I|J|K|L|M|N|O|P|Q|R|S|T|U|V|W|X|Y|Z¦
¦---------------------------------------------------¦
¦A|B|C|D|E|F|G|H|I|J|K|L|M|N|O|P|Q|R|S|T|U|V|W|X|Y|Z¦
¦---------------------------------------------------¦
¦A|B|C|D|E|F|G|H|I|J|K|L|M|N|O|P|Q|R|S|T|U|V|W|X|Y|Z¦
¦---------------------------------------------------¦
¦A|B|C|D|E|F|G|H|I|J|K|L|M|N|O|P|Q|R|S|T|U|V|W|X|Y|Z¦
¦---------------------------------------------------¦
¦A|B|C|D|E|F|G|H|I|J|K|L|M|N|O|P|Q|R|S|T|U|V|W|X|Y|Z¦
¦---------------------------------------------------¦
¦A|B|C|D|E|F|G|H|I|J|K|L|M|N|O|P|Q|R|S|T|U|V|W|X|Y|Z¦
+---------------------------------------------------+

推荐阅读