Autor Beitrag
Netroshin
Hält's aus hier
Beiträge: 1



BeitragVerfasst: Fr 01.07.22 19:24 
Hallo an alle!
Mein erster Beitrag hier auf dem Forum, da ich leider keine konkrete Antwort auf meine Programmierung finde, die richtig läuft.

Aus mehreren Internetseiten finde ich die automatische Sortierung mehrerer Zeilen aus einer Datei. Dennoch funktioniert sie aus mir unbekannten Gründen nur "halb".

Erstmal die Links, die ich verwendet habe:
Vorgehensweise: Sortieren oder Filtern von Textdaten nach einem beliebigen Wort oder Feld (LINQ)(C#)
How to: Reorder the Fields of a Delimited File (LINQ) (Visual Basic)

Beide sagen aus, dass die Zeilen in einer Liste gesplittet werden und dann nach einer Spalte sortiert werden, die man eingibt.
Allerdings wird die Zahl ja nicht als int sondern als string wahrgenommen, also wird immer der Anfang des Strings ausgewertet.

Mein Code sieht wie folgt aus:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
string[] RanglisteGesamt = File.ReadAllLines(RanglistenPfad);
foreach (string str in RunQuery(RanglisteGesamt, 0))
{
    RanglisteSortiert = RanglisteSortiert + "\n" + str;
}
File.WriteAllText(RanglistenPfad, RanglisteSortiert);


static IEnumerable<string> RunQuery(IEnumerable<string> source, int num)
{
    var scoreQuery = from line in source
                     let fields = line.Split(new char[] {'\\'})
                     orderby fields[num]
                     select line;

   return scoreQuery;
}

Alles, was dabei herauskommt, ist das Ergebnis: (Die 2. Spalte soll sortiert werden)

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
MissingName\3\18
auraaa_brw\31\37072
MissingName\35\53470
MissingName\37\46678
MissingName\40\52444
shrenix\41\58984
MissingName\47\91957
Netroshin\50\112577
MissingName\54\147380
MissingName\6\264
MissingName\7\213
MissingName\7\333
MissingName\73\2411
MissingName\8\861
MissingName\8\462
MissingName\9\1094
MissingName\9\571
MissingName\9\351
MissingName\91\742072


Mache ich aus der Zeile int, ist der Text im Weg. Gibt es eine Lösung, ohne dass ich aus diesem einen string ein int machen muss mit einer weiteren Funktion?

Danke schonmal für eure Antworten.

Moderiert von user profile iconTh69: URL-Titel hinzugefügt
Moderiert von user profile iconTh69: Quote- durch C#-Tags ersetzt
Moderiert von user profile iconTh69: C#- durch Code-Tags ersetzt
Moderiert von user profile iconTh69: C#-Tags hinzugefügt
Moderiert von user profile iconTh69: Topic aus C# - Die Sprache verschoben am Mi 21.12.2022 um 13:13
Einloggen, um Attachments anzusehen!
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Fr 01.07.22 19:58 
Hallo und :welcome:,

da sieht man, daß die Doku-Beispiele doch oftmals sehr vereinfacht sind (daher sind die Zahlenwerte dort alle gleich lang).
Wenn du nach den Zahlen sortieren willst, dann mußt du auch Zahlenwerte vergleichen.
Am einfachsten wohl per Int32.Parse:
ausblenden C#-Quelltext
1:
2:
3:
4:
var scoreQuery = from line in source
                 let fields = line.Split(new char[] {'\\'})
                 orderby Int32.Parse(fields[num]) // evtl. noch 'descending' falls absteigend sortiert
                 select line;
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Fr 01.07.22 21:06 
Wenn du nach einer beliebigen Spalte sortieren willst könnte man die Texte wieder auf gleiche Länge bringen. Funktioniert aber nur wenn du je Spalte eine Annahme für deren maximal Länge triffst bzw. treffen kannst.

ausblenden C#-Quelltext
1:
2:
3:
4:
var scoreQuery = from line in source
let fields = line.Split('\\')
orderby fields[num].PadLeft(myLovelyMaxColumnWidth)
select line;


Gibts bei File.WriteAllLines ein Problem mit dem NewLine Character? Hätte gedacht das ist spätestens seit Net. Core einstellbar.

Edit: Näh dann sortiert Text falsch. Du musst vermutlich vorher anhand von num entscheiden ob das ein Text oder Int Spalte ist und dann das passende Linq Statement (mit Int.Parse oder ohne) wählen.