2

我正在尝试将一些输出格式化到控制台,但解决方案存在一些问题。我在 C# 中执行此操作,但是每次我调用 Console.Write 时,它​​都会将整个内容打印到控制台的最后,然后开始新的一行。所以我想做的是将它调整为四列,然后在那里开始一个新行。

这是输出在控制台中的正确方式:

Sam       John      Bob     Adam

Kelly     Nolan     Carl    Tim

Tom       David

这是我的结果,但它是错误的方式:

Sam    John    Bob    Adam  Kelly  Nolan   Carl   Tim

Tom    David

如果您有任何想法,请提供

4

5 回答 5

3

我会写一些管理填充和布局的东西..也许是这样的?

class ConsoleColumnFormatter {
    private int _columnWidth = 20;
    private int _numColumns = 4;

    private int _currentColumn = 0;

    public ConsoleColumnFormatter(int numColumns, int columnWidth) {
        _numColumns = numColumns;
        _columnWidth = columnWidth;
    }

    public void Write(string str) {
        Console.Write(str.PadRight(_columnWidth - str.Length, ' '));
        _currentColumn++;

        checkForNewLine();
    }

    private void checkForNewLine() {
        if (_currentColumn >= _numColumns) {
            Console.Write("\n");
            _currentColumn = 0;
        }
    }
}

这个:

ConsoleColumnFormatter formatter = new ConsoleColumnFormatter(4, 20);

for (int i = 1; i <= 10; i++)
    formatter.Write("Column " + i.ToString());

..产生,这个:

Column 1    Column 2    Column 3    Column 4
Column 5    Column 6    Column 7    Column 8
Column 9    Column 10
于 2012-11-08T05:56:46.170 回答
3

如果我理解您的问题。我使用以下技术在控制台中打印出 Txt(日志文件)中的表格。

诀窍是使用 String.format

// Example from - http://msdn.microsoft.com/en-us/library/system.string.format.aspx



using System;

public class Example
{
   public static void Main()
   {
      // Create array of 5-tuples with population data for three U.S. cities, 1940-1950.
      Tuple<string, DateTime, int, DateTime, int>[] cities = 
          { Tuple.Create("Los Angeles", new DateTime(1940, 1, 1), 1504277, 
                         new DateTime(1950, 1, 1), 1970358),
            Tuple.Create("New York", new DateTime(1940, 1, 1), 7454995, 
                         new DateTime(1950, 1, 1), 7891957),  
            Tuple.Create("Chicago", new DateTime(1940, 1, 1), 3396808, 
                         new DateTime(1950, 1, 1), 3620962),  
            Tuple.Create("Detroit", new DateTime(1940, 1, 1), 1623452, 
                         new DateTime(1950, 1, 1), 1849568) };

      // Display header 
      string header = String.Format("{0,-12}{1,8}{2,12}{1,8}{2,12}{3,14}\n",
                                    "City", "Year", "Population", "Change (%)");
      Console.WriteLine(header);
      string output;      
      foreach (var city in cities) {
         output = String.Format("{0,-12}{1,8:yyyy}{2,12:N0}{3,8:yyyy}{4,12:N0}{5,14:P1}",
                                city.Item1, city.Item2, city.Item3, city.Item4, city.Item5,
                                (city.Item5 - city.Item3)/ (double)city.Item3);
         Console.WriteLine(output);
      }
   }
}
// The example displays the following output: 
//    City            Year  Population    Year  Population    Change (%) 
//     
//    Los Angeles     1940   1,504,277    1950   1,970,358        31.0 % 
//    New York        1940   7,454,995    1950   7,891,957         5.9 % 
//    Chicago         1940   3,396,808    1950   3,620,962         6.6 % 
//    Detroit         1940   1,623,452    1950   1,849,568        13.9 %
于 2013-02-21T14:32:37.323 回答
1

你应该这样写:

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

namespace ConsoleApplication1  
{  
    class Program  
    {  
        static void Main(string[] args)  
        {  
            List<string> names = new List<string>()  {"Sam","John","Bob","Adam","Kelly","Nolan","Carl","Tim","Tom","David"};  

            for (int i = 0; i < names.Count; i++)
            {
                if (i % 4 == 0 && i > 0)
                    Console.WriteLine();

                Console.Write(names[i] + "\t");

            }

            Console.ReadLine();
        }
    }
}

输出将与您希望的相同

在此处输入图像描述

于 2012-11-08T06:09:52.093 回答
0

您还可以利用 StringBuilder 的 AppendLine 或 Environment.NewLine - 在输出到控制台之前格式化行字符串。

于 2012-11-08T05:58:40.737 回答
0

要开始新行:

Console.WriteLine();

例如:

var names = str.Split();
for (int i = 0; i < names.Length; i++)
{
    Console.Write(names[i] + '\t');
    if ((i + 1) % 4 == 0)
        Console.WriteLine();
}
于 2012-11-08T05:50:11.330 回答