Mam ciekawe pytanie. Wyobraź sobie, że mam wiele danych zmieniających się w bardzo szybkich odstępach czasu. Chcę wyświetlić te dane jako tabelę w aplikacji konsoli. np .:
-------------------------------------------------------------------------
| Column 1 | Column 2 | Column 3 | Column 4 |
-------------------------------------------------------------------------
| | | | |
| | | | |
| | | | |
-------------------------------------------------------------------------
Jak sprawić, by wszystko działało szybko i jak poprawić szerokość kolumn? Wiem, jak to zrobić w Javie, ale nie wiem, jak to się robi w C #.
Odpowiedzi:
Możesz zrobić coś takiego:
źródło
Użyj String.Format z wartościami wyrównania.
Na przykład:
Aby utworzyć jeden sformatowany wiersz.
źródło
-
przypadku treści wyrównanych do lewej, np .:{0,-5}
Edycja: dzięki @superlogical możesz teraz znaleźć i ulepszyć następujący kod na github !
Napisałem tę klasę w oparciu o kilka pomysłów tutaj. Szerokość kolumn jest optymalna i może obsługiwać tablice obiektów za pomocą tego prostego interfejsu API:
Oto klasa:
Edycja: dodałem drobne ulepszenie - jeśli chcesz, aby nagłówki kolumn były nazwą właściwości, dodaj następującą metodę do
TableParser
(zauważ, że będzie ona nieco wolniejsza z powodu odbicia):źródło
arrValues[rowIndex, colIndex] = valueSelectors[colIndex].Invoke(values[rowIndex - 1]).ToString();
abyvar val = valueSelectors[colIndex].Invoke(values[rowIndex - 1]); arrValues[rowIndex, colIndex] = val == null ? "null" : val.ToString();
w ten sposób pokazało zero.Istnieje kilka bibliotek typu open source, które umożliwiają formatowanie tabel konsoli, od prostych (jak przykłady kodu w odpowiedziach tutaj) do bardziej zaawansowanych.
ConsoleTable
Sądząc po statystykach NuGet, najpopularniejszą biblioteką do formatowania tabel jest ConsoleTable . Tabele są zbudowane w następujący sposób (z pliku readme):
Tabele można formatować przy użyciu jednego ze wstępnie zdefiniowanych stylów. Będzie to wyglądać tak:
Ta biblioteka oczekuje komórek jednowierszowych bez formatowania.
Istnieje kilka bibliotek opartych na ConsoleTable z nieco rozszerzonymi zestawami funkcji, takimi jak więcej stylów linii.
CsConsoleFormat
Jeśli potrzebujesz bardziej złożonego formatowania, możesz użyć CsConsoleFormat . † Oto tabela wygenerowana na podstawie listy procesów (z przykładowego projektu):
Efekt końcowy będzie wyglądał następująco:
Obsługuje wszelkiego rodzaju wiersze tabeli (kilka dołączonych i konfigurowalnych), komórki wieloliniowe z zawijaniem słów, kolorami, kolumnami rosnącymi w oparciu o zawartość lub procent, wyrównanie tekstu itp.
† CsConsoleFormat został opracowany przeze mnie.
źródło
TextWrap = TextWrapping.NoWrap
inaczej niż w powyższym przykładzie).new Cell(text) { Color = text == "true" ? Green : Red }
. Jeśli masz wiele tabel z podobnymi regułami formatowania, możesz umieścić ten kod w jakiejś funkcji, czy to dla komórki, wiersza lub całej tabeli.źródło
StreamWriter
naTextWriter
. 2. ZamieńPrintToConsole
kod na:PrintToStream(arrValues, Console.Out);
3. ??? 4. ZYSK!Chciałem kolumn o zmiennej szerokości i nie przejmowałem się specjalnie znakami ramek. Musiałem również wydrukować dodatkowe informacje dla każdego wiersza.
Więc na wypadek, gdyby ktoś tego potrzebował, zaoszczędzę ci kilka minut:
Wynik:
źródło
To ulepszenie poprzedniej odpowiedzi. Dodaje obsługę wartości o różnych długościach i wierszy z różną liczbą komórek. Na przykład:
Oto kod:
źródło
Na wypadek, gdyby to komuś pomogło, to jest prosta klasa, którą napisałem na swoją potrzebę. Możesz go łatwo zmienić, aby dopasować go do swoich potrzeb.
Przykładowe użycie:
Wynik:
źródło
Mam projekt na GitHubie, z którego możesz skorzystać
https://github.com/BrunoVT1992/ConsoleTable
Możesz go używać w ten sposób:
Da taki wynik:
źródło
Użyj biblioteki MarkDownLog (możesz ją znaleźć w NuGet)
możesz po prostu użyć rozszerzenia ToMarkdownTable () do dowolnej kolekcji, wykonuje ono całe formatowanie za Ciebie.
Wynik wygląda mniej więcej tak:
źródło
źródło
W VisualBasic.net jest łatwiej!
Jeśli chcesz, aby użytkownik mógł ręcznie wprowadzać dane do tabeli:
To powinno wyglądać tak:
źródło