Одним из способов вывода списка элементов в формате столбца является определение количества строк (путем деления количества элементов на количество столбцов и добавления 1, если количество не делится равномерно на количество столбцов), изатем выведите «количество столбцов» количество элементов, отформатированных по ширине столбца.
Мы можем написать метод, который принимает список строк, а затем выводит строки в столбцы определенной ширины:
public static void OutputInColumns(List<string> items, int columnCount,
int columnWidth, string header = null)
{
// If no columns or no items are specified, return
if (columnCount == 0 || items?.Any() != true) return;
var count = items.Count;
// Determine how many rows we need and fill in last row with empty values if needed
var rows = count / columnCount + (count % columnCount > 0 ? 1 : 0);
items.AddRange(Enumerable.Range(0,
columnCount - count % columnCount).Select(x => string.Empty));
// Output our column headers
if (!string.IsNullOrEmpty(header))
Console.WriteLine(string.Join(" ║ ",
Enumerable.Range(0, columnCount)
.Select(x => header.PadRight(columnWidth, ' '))));
// Output a divider
if (!string.IsNullOrEmpty(header))
Console.WriteLine(string.Join("═╬═",
Enumerable.Range(0, columnCount)
.Select(x => new string('═', columnWidth))));
// Output our row data
for (int row = 0; row < rows; row++)
{
// For each row, add a line with items separated by a tab
Console.WriteLine(string.Join(" ║ ", items
.Skip(row * columnCount)
.Take(columnCount)
.Select(item => item
.Substring(0, Math.Min(item.Length, columnWidth))
.PadRight(columnWidth, ' '))));
}
}
Далее мы можем написать метод, который принимает Book
и выводит строку в формате "Title....PublishDate"
. Мы можем позволить пользователю передать значение ширины части Title
и по умолчанию показывать весь заголовок, если ширина не указана:
public static string AsColumnString(Book book, int columnWidth = 0)
{
if (columnWidth < 1) columnWidth = book.Title.Length + 8;
var name = book.Title.Substring(0, Math.Min(book.Title.Length, columnWidth - 8))
.PadRight(columnWidth - 5, '.');
var date = book.PublishDate.ToString("MM-yy");
return $"{name}{date}";
}
Теперь, если у нас есть списоккниг, мы можем легко напечатать их в любом количестве столбцов (с любой шириной столбца, которую мы выбираем):
public static void Main(string[] args)
{
var books = new List<Book>
{
new Book {Title = "Ulysses", PublishDate = DateTime.Parse("February 2, 1922")},
new Book {Title = "Don Quixote", PublishDate = DateTime.Parse("January 16, 1605")},
new Book {Title = "The Great Gatsby", PublishDate = DateTime.Parse("April 10, 1925")},
new Book {Title = "Moby Dick", PublishDate = DateTime.Parse("October 18, 1851")},
new Book {Title = "War and Peace", PublishDate = DateTime.Parse("January 1, 1869")},
new Book {Title = "Hamlet", PublishDate = DateTime.Parse("January 1, 1603")},
new Book {Title = "To Kill a Mockingbird", PublishDate = DateTime.Parse("July 11, 1960")},
new Book {Title = "The Catcher in the Rye", PublishDate = DateTime.Parse("July 16, 1951")},
new Book {Title = "The Hobbit", PublishDate = DateTime.Parse("September 21, 1937")},
new Book {Title = "Fahrenheit 451", PublishDate = DateTime.Parse("October 19, 1953")},
new Book {Title = "The Handmaid's Tale", PublishDate = DateTime.Parse("January 1, 1985")},
};
// Select the longest book title and add '8' for the three dots and the date
var columnWidth = books.Select(b => b.Title.Length).Max() + 8;
var columnCount = 2;
// Create our header for each column
var header = "Book".PadRight(columnWidth - 5) + "Date";
OutputInColumns(books.Select(b => AsColumnString(b, columnWidth)).ToList(),
columnCount, columnWidth, header);
}
Вывод
![enter image description here](https://i.stack.imgur.com/TlR33.png)
Вот еще один пример, только на этот раз с использованием 4 более узких столбцов:
// Note we can make our columns smaller and add more of them
columnWidth = 16;
columnCount = 4;
header = "Book".PadRight(columnWidth - 5) + "Date";
OutputInColumns(books.Select(b => AsColumnString(b, columnWidth)).ToList(), columnCount,
columnWidth, header);
Вывод
![enter image description here](https://i.stack.imgur.com/Nkga3.png)
Примечание. Возможно, вы захотите указать полный год в качестве даты, поскольку используемые мной образцы охватывают несколько веков, последние две цифры не очень полезны. :)
Заголовок