在表C#中显示数组2D中的值

时间:2018-08-17 23:41:24

标签: c# arrays

我是C#编程的新手,我正在尝试创建一种方法,该方法允许我创建表并可视化矩阵内的数据。但是,我尝试过的任何方法似乎都无法按预期工作。

基本上,该方法可以使标题(即Enum)可视化,但是我需要从矩阵中读取数据,并且输出必须采用表格形式。到目前为止,这是代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp3
{
    enum clientHeader { Id, Name, Surname, Addres, Cod_Postal, Telephone, Email, State };

    class Program
    {
        static void Main(string[] args)
        {
            string[,] client = new string[3, 7];

            insertData<clientHeader>(client);
            Console.Clear();
            showHeader<clientHeader>(client);

            listData<clientHeader>(client); 

            Console.ReadKey();
        }

       static void insertData<T>(string[,] matrix)
       {
            int x = matrix.GetLowerBound(1);
            matrix[0, x] = "1";

            for (int j = 1; j < matrix.GetLength(1); j++)
            {
                do
                {
                    Console.Write($"\nInsert {GetHeader<T>(j)}: ");
                    matrix[0, j] = Console.ReadLine();
                } while (String.IsNullOrEmpty(matrix[0, j]));
            }
        }

        static void listData<T>(string[,] matrix)
        {
            for (int i = 0; i < matrix.GetLength(0); i++)
            {
                for (int j = 0; j < matrix.GetLength(1); j++)
                {
                    Console.Write($"{matrix[i, j]}\t");
                }
            }

            Console.WriteLine();
        }
    }

    private static string GetHeader<T>(int i) => Enum.GetName(typeof(T), i);

        static void showHeader<T>(string[,] matrix)
        {
            int x = matrix.GetUpperBound(1);
            string[] array = new string[x];

            for (int i = 0; i < array.Length; i++)
            {
                array[i] = GetHeader<T>(i);
            }

            PrintLine();
            PrintRow(array);
            PrintLine();
        }

        static int tableWidth = 120;

        static void PrintLine()
        {
            Console.WriteLine(new string('-', tableWidth));
        }

        static void PrintRow(params string[] columns)
        {
            int width = (tableWidth - columns.Length) / columns.Length;
            string row = "|";

            foreach (string column in columns)
            {
                row += AlignCentre(column, width) + "|";
            }

            Console.WriteLine(row);
        }

        static string AlignCentre(string text, int width)
        {
            text = text.Length > width ? text.Substring(0, width - 3) + "..." : text;

            if (string.IsNullOrEmpty(text))
            {
                return new string(' ', width);
            }
            else
            {
                return text.PadRight(width - (width - text.Length) / 2).PadLeft(width);
            }
        }
    }
}

2 个答案:

答案 0 :(得分:2)

在下面的代码中,我所做的主要修改是使您的TfidfVectorizer方法的行为类似于您的ListData方法,以便使数据在标头下方的列中对齐:

ShowHeader

查看是否适合您。这是带有其他重构的完整代码:

private static void ListData<T>(string[,] matrix)
{
    var array = new string[matrix.GetUpperBound(1)];

    for (var i = 0; i < array.Length; i++)
    {
        array[i] = matrix[0, i];
    }

    PrintRow(array);
    PrintLine();
}

输出

enter image description here

答案 1 :(得分:0)

我试图这样做,不知道这是否是您的意思,但是程序崩溃了。仍然不读第二行,由于某些原因,我认为AlignCenter方法中的变量文本为null。

  private static void ListData<T>(string[,] matrix)
        {
            var array = new string[matrix.GetUpperBound(1)];
            for (int j = 0; j < array.GetUpperBound(0); j++)
            {
                for (var i = 0; i < array.Length; i++)
                {
                    array[i] = matrix[j, i];
                }

                PrintRow(array);
                PrintLine();
            }
        }