Array anhand einer Zahl im String sortieren

  • C#

Es gibt 15 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Array anhand einer Zahl im String sortieren

    Guten Tag,

    und zwar möchte ich gerne mein Array anhand der Zahlen wie im Bild (rot eingerahmt) zusehen, sortieren. Also vom niedrigsten bis zum höchsten. Wie kann ich das am besten verwirklichen?




    Anhänge:
    - Screenshot, anhand welcher Zahlen ich sortieren möchte (Rot eingerahmt)
    - Original Screenshot ohne roten Rahmen
    Bilder
    • Screenshot_718.png

      4,32 kB, 292×65, 62 mal angesehen
    • Screenshot_719.png

      4,07 kB, 297×71, 63 mal angesehen
    Hey,

    elegant wäre, wenn Du eine Klasse erstellst, die einen Spieler (Player) abbildet. Etwa so.

    C#-Quellcode

    1. public class Player
    2. {
    3. public int ID { get; set; }
    4. public DateTime Date { get; set; }
    5. public string Type { get; set; }
    6. public static Player Parse(string s)
    7. {
    8. string[] data = s.Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries);
    9. return new Player() { ID = int.Parse(data[1]), Date = DateTime.Parse(data[2]), Type = data[3] };
    10. }
    11. }


    Eine Instanz dieser Player-Klasse erzeugt sich selbst mit Hilfe einer Zeile Deines Arrays.

    C#-Quellcode

    1. private void button1_Click(object sender, EventArgs e)
    2. {
    3. string s = string.Join(Environment.NewLine, new string[] {
    4. "PLAYER,2,26.04.2021 09:01:44,MODUS",
    5. "PLAYER,4,26.04.2021 09:02:34,MODUS",
    6. "PLAYER,11,26.04.2021 09:07:34,MODUS",
    7. "PLAYER,8,26.04.2021 09:28:06,MODUS"});
    8. List<Player> players = new List<Player>();
    9. foreach (string x in s.Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries))
    10. {
    11. players.Add(Player.Parse(x));
    12. }
    13. players = players.OrderBy((x) => x.ID).ToList();
    14. }
    15. }


    Wie Du die Zeilen einliest, bleibt Dir überlassen, in meinem Beispiel hab ichs einfach abgetippt. Erstellt wir als erstes eine Liste von Player und jede Player-Instanz wird erzeugt. Danach kannst Du nach belieben sortieren => .OrderBy

    EDIT. Hab C# überlesen, das Prinzip bleibt aber das Gleiche.
    EDIT. C# Code nachgerreicht.
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „SpaceyX“ ()

    war ja nah dran :D

    Array.Sort so wie du es nutzt sortiert nicht wirklich dein Array, weil es nicht weiß, nach was es sortieren soll.

    Array.Sort hat überladungen, das heißt die Methode "Sort" kann mit unterschiedlichen parameter aufgerufen werden.

    Hier findest du eine kurze übersicht der überladungen docs.microsoft.com/en-us/dotne…rt?view=net-5.0#overloads

    Welche du brauchst ist die: docs.microsoft.com/en-us/dotne…s_Generic_IComparer___0__, weil du hier angeben kannst nach was er sotieren kann mithilfe eines IComparer<T>.

    Was ist das IComparer<T>?
    Das ist ein Interface und findest du hier docs.microsoft.com/en-us/dotne….icomparer-1?view=net-5.0

    Probier das mal einzubinden :D ein beispiel ist auf der webseite mit oben :D
    Du brauchst eine Klasse, die das IComparer<T> Interface implementiert.

    C#-Quellcode

    1. public class PlayerStringComparer : IComparer<string>
    2. {
    3. int IComparer<string>.Compare(string x, string y)
    4. {
    5. string[] data1 = x.Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries);
    6. string[] data2 = y.Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries);
    7. return int.Parse(data1[1]).CompareTo(int.Parse(data2[1]));
    8. }
    9. }


    Die Funktion Compare wird dann durch die Funktion Sort des Arrays/Liste aufgerufen.

    C#-Quellcode

    1. private void button1_Click(object sender, EventArgs e)
    2. {
    3. List<string> players = new List<string>(new string[] {
    4. "PLAYER,2,26.04.2021 09:01:44,MODUS",
    5. "PLAYER,4,26.04.2021 09:02:34,MODUS",
    6. "PLAYER,11,26.04.2021 09:07:34,MODUS",
    7. "PLAYER,8,26.04.2021 09:28:06,MODUS"});
    8. players.Sort(new PlayerStringComparer());
    9. }
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o
    @SpaceyX Danke sehr, allerdings funktioniert das irgendwie bei mir nicht.

    C-Quellcode

    1. string[] getScoreArray = new string[100];
    2. StreamReader list = new StreamReader(@"E:\stream.json");
    3. getScoreArray = list.ReadToEnd().Split("");
    4. Array.Sort(getScoreArray, new PlayerStringComparer());
    5. foreach (var item in sortedListByFile)
    6. {
    7. writeLine(item);
    8. }

    C#-Quellcode

    1. public class PlayerStringComparer : IComparer<string>
    2. {
    3. int IComparer<string>.Compare(string x, string y)
    4. {
    5. string[] data1 = x.Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries);
    6. string[] data2 = y.Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries);
    7. return int.Parse(data1[1]).CompareTo(int.Parse(data2[1]));
    8. }
    9. }
    @Facebamm ich verstehe, dass ich sehr unerfahren rüber komme Das Tutorial habe ich tatsächlich bereits angeschaut.
    Manchmal denke ich wohl einfach nicht so weit und verstehe dann ein bestimmtes Thema nicht, egal wie einfach es auch scheint. Ich mache wohl erstmal nh' Pause und schaue dann mal.
    Dennoch bedanke ich mich, für die Hilfe von euch.

    Liebe Grüße
    @Raini Vielleicht versuchst Du zunächst etwas leichtere Kost zum warm werden:
    [Sammelthread] Programmieren, aber was? (Programmideen)
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Raini schrieb:

    und habe es direkt verstanden
    So was könnte man als Lerneffekt bezeichnen. :thumbsup:
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!