C# - List als Tabelle ausgeben?

3 Antworten

Vom Beitragsersteller als hilfreich ausgezeichnet

Ganz einfach. Du bräuchtest am besten die Maximal länge deiner Zahlen oder kannst diese natürlich auch festschreiben. Bei einer Maximalen Höhe von einer Million wären dies 7 Zeichen. 

public static void ReiheZeichen(zahlenListe){
    Console.Write('|');
    for(int i = 0; i < zahlenListe.Count;i++){
       Console.Write(zahlenListe[i]);
       for(int i = zahlenListe.ToString().Length; i < 7; i++){
          Console.Write(' ');
       }
}

Als Erstes zeichnen wir ein den Linken Rand der Zelle,

anschließend die Zahl, und danach füllen wir bis eben 7 Zeichen erreicht wurden den Rest mit einer Leerstelle aus.

Das Ganze eben für jede Zahl und so hat man eine halbwegs formatierte Tabelle. (In einer Zeile).

Mehrzeilige Tabellen werden jedoch ein wenig komplizierter, da man da die Konsolenbreite mit einbeziehen muss damit die Zeilen alle richtig übereinander gezeichnet werden. 

Woher ich das weiß:Berufserfahrung – Beruf, Schule, Hobby und eigene Erfahrungen

Bu88ble2000 
Beitragsersteller
 11.12.2016, 17:56

Gut, das sieht dann schön aus, aber dann kann ich mir das mit der Liste quasi auch sparen und einfach in der while Schleife am Ende ein Console.Write mit dem Ergebnis der jeweiligen Durchführung der While schleife raushauen. Dann bekomme ich auch alle Zahlen hintereinander her ;) Soll ich mal ein Codebeispiel zum Verständnis hochladen?

0
Berny96  11.12.2016, 18:35
@Bu88ble2000

Weiß schon was du meinst und klar kannst du das so machen. Die Liste hilft dir eben wenn du die Daten weiter verarbeiten möchtest und später drauf zugreifen musst.

0
Bu88ble2000 
Beitragsersteller
 13.12.2016, 20:08
@Berny96
Danke, hab das Problem jetzt gelöst, Code wie folgt:

for (int x = 0; x < Liste.Count; x++)
{
float check = (x / 1);
if (check % 5 == 0)
{
Console.WriteLine(Liste[x]+" ");
}
else
{
Console.Write(Liste[x]+" ");
}
}

So springt er mir nach allen 5 Zahlen in eine neue Zeile. Untereinander sind die Zahlen natürlich nicht perfekt geordnet, aber dennoch ist es so viel besser als vorher!

Evtl. hätte man das auch mit ner 2D-Array darstellen können, als verfeinerung, wenn das Projekt realisiert ist, werde ich das ausprobieren!

0

Nachträgliche Lösung mit LINQ:

1. als erstes bestimmen wir für jede Zahl im Array/Liste den Index:
würde dann für die Zahlen unterhalb wiefolgt aussehen (Index, Zahl): (0, 1), (1, 3), (2, 4), (3, 3) etc.

2. Danach wird jeder Index durch die gewünschte Länge dividiert (ohne Rest). Für die Indizes 0-4 ergibt das 1, 5-9 ergibt 2 usw. D.h. wir erhalten jeweils 5 Paare mit dem gleichen Index. Nach diesem wird mittels GroupBy gruppiert.

3. Für jede Gruppe wählen wir wieder das Element mittels Select aus und konkatenieren diese Elemente mittels string.Join mit Leerzeichen.

4. Die resultierenden Strings verbinden wir dann mit dem NewLine-Zeichen (\n)

var numbers = new[] { 1, 3, 4, 3, 3, 2, 3 };
const int length = 5;

var tmp = numbers .Select((x, index) => new { Index = index, Value = x }) .GroupBy(x => x.Index / length) .Select(x => string.Join(" ", x.Select(v => v.Value)));
Console.WriteLine(string.Join("\n", tmp));

Die Ausgabe für die obigen Zahlen sieht so aus:

1 3 4 3 3
2 3
int row = 0; col = 0;
foreach (var item in list)
{
  gebeAus(row, col, item);
  col++;
  if (col >= colCount)
  {
    col = 0; row++;
  }
}

Tippfehler vorbehalten.


Bu88ble2000 
Beitragsersteller
 11.12.2016, 17:58

Danke für die Antwort, kannst du vlt. noch kurz was zum geschriebenen sagen? Ich würde gern verstehen was genau du da geschrieben hast, danke! :)

0
Mikkey  11.12.2016, 18:03
@Bu88ble2000

colCount ist die angenommen Tabellenbreite (nach Deinen Angaben also 5).

Der Schnipsel geht die Liste (list) Elementweise durch (foreach).

gibt in das Tabellenelement mit Spalte row und Zeile col das Element aus.

Erhöht die Spalte

Ist die Tabellenbreite erreicht, wird auf die nächste Zeile und darin die erste Spalte gewechselt.

Die restlichen Zellen in der Tabelle bleiben leer.

0