Eu tenho uma pergunta interessante. Imagine que tenho muitos dados mudando em intervalos muito rápidos. Quero exibir esses dados como uma tabela no aplicativo de console. f.ex:
-------------------------------------------------------------------------
| Column 1 | Column 2 | Column 3 | Column 4 |
-------------------------------------------------------------------------
| | | | |
| | | | |
| | | | |
-------------------------------------------------------------------------
Como manter as coisas rápidas e como consertar as larguras das colunas? Eu sei como fazer isso em java, mas não sei como é feito em C #.
Respostas:
Você poderia fazer algo como o seguinte:
fonte
Use String.Format com valores de alinhamento.
Por exemplo:
Para criar uma linha formatada.
fonte
-
para o conteúdo alinhado à esquerda, por exemplo:{0,-5}
Edit: graças a @superlogical, agora você pode encontrar e melhorar o seguinte código no github !
Escrevi esta aula com base em algumas idéias aqui. A largura das colunas é ideal e pode lidar com matrizes de objetos com esta API simples:
Aqui está a aula:
Edit: Eu adicionei uma pequena melhoria - se você quiser que os cabeçalhos das colunas sejam o nome da propriedade, adicione o seguinte método a
TableParser
(observe que será um pouco mais lento devido à reflexão):fonte
arrValues[rowIndex, colIndex] = valueSelectors[colIndex].Invoke(values[rowIndex - 1]).ToString();
paravar val = valueSelectors[colIndex].Invoke(values[rowIndex - 1]); arrValues[rowIndex, colIndex] = val == null ? "null" : val.ToString();
assim mostra nulo.Existem várias bibliotecas de código aberto que permitem a formatação de tabelas de console, variando de simples (como os exemplos de código nas respostas aqui) a mais avançada.
ConsoleTable
A julgar pelas estatísticas do NuGet, a biblioteca mais popular para formatar tabelas é ConsoleTable . As tabelas são construídas assim (a partir do arquivo leia-me):
As tabelas podem ser formatadas usando um dos estilos predefinidos. Será parecido com este:
Esta biblioteca espera células de linha única sem formatação.
Existem algumas bibliotecas baseadas em ConsoleTable com conjuntos de recursos ligeiramente estendidos, como mais estilos de linha.
CsConsoleFormat
Se precisar de uma formatação mais complexa, você pode usar CsConsoleFormat . † Aqui está uma tabela gerada a partir de uma lista de processos (de um projeto de amostra):
O resultado final será assim:
Suporta qualquer tipo de linha de tabela (várias inclusas e personalizáveis), células multilinhas com quebra de linha, cores, crescimento de colunas com base no conteúdo ou porcentagem, alinhamento de texto etc.
† CsConsoleFormat foi desenvolvido por mim.
fonte
TextWrap = TextWrapping.NoWrap
ao contrário do exemplo acima).new Cell(text) { Color = text == "true" ? Green : Red }
. Se você tiver muitas tabelas com regras de formatação semelhantes, poderá colocar esse código em alguma função, seja para célula, linha ou tabela inteira.fonte
StreamWriter
paraTextWriter
. 2. Substitua oPrintToConsole
código por:PrintToStream(arrValues, Console.Out);
3. ??? 4. LUCRO!Eu queria colunas de largura variável e não me importava particularmente com os caracteres da caixa. Além disso, precisei imprimir algumas informações extras para cada linha.
Portanto, caso mais alguém precise disso, economizarei alguns minutos:
Resultado:
fonte
Esta é uma melhoria em relação à resposta anterior. Ele adiciona suporte para valores com comprimentos variados e linhas com um número variável de células. Por exemplo:
Aqui está o código:
fonte
Eu tenho um projeto no GitHub que você pode usar
https://github.com/BrunoVT1992/ConsoleTable
Você pode usá-lo assim:
Isso dará este resultado:
fonte
Use a biblioteca MarkDownLog (você pode encontrá-la no NuGet)
você pode simplesmente usar a extensão ToMarkdownTable () para qualquer coleção, ela faz toda a formatação para você.
O resultado é mais ou menos assim:
fonte
Caso isso ajude alguém, esta é uma aula simples que escrevi para minha necessidade. Você pode alterá-lo facilmente para atender às suas necessidades.
Uso de amostra:
Resultado:
fonte
fonte
É mais fácil em VisualBasic.net!
Se você deseja que o usuário possa inserir dados manualmente em uma tabela:
Deve ser assim:
fonte