Сортировать список, состоящий из строк, состоящих из строк и целых чисел - PullRequest
0 голосов
/ 17 июня 2020

, поэтому у меня есть список в C#, состоящий из строк, состоящих из строк и целых чисел. Например, «Джим: 50» или «Бен: 27». Я хочу иметь возможность отсортировать этот список по целому числу, но не знаю, с чего начать. Мой текущий код:

using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using System.IO;

public class Leaderboard : MonoBehaviour {

    string path = "Assets/Statistics.json";

    public List<string> scoresList = new List<string>();

    void Start() {
        JSONUnpacker();
        scoresList.Sort(scoreSorter);
    }

    void JSONUnpacker() {
        // Read from json file
        string jsonData = File.ReadAllText(path);
        leaderboard leaderboard = JsonUtility.FromJson<leaderboard>(jsonData);
        foreach(var i in leaderboard.statDataList) {
            // Repeat for every stat record
            string temp = i.username + ":" + i.score;
            scoresList.Add(temp);
        }
    }

    [System.Serializable]
    public class leaderboardData {

        public string username;
        public int score;
    }

    private class leaderboard {

        public List<leaderboardData> statDataList = new List<leaderboardData>();
    }
}

Любая помощь приветствуется, спасибо!

Ответы [ 4 ]

1 голос
/ 17 июня 2020

Вам нужно получить числовую строку и превратить ее в целое число. Например, если вам гарантирован формат "буквы" + ":" + "числа", вы можете сделать что-то вроде этого:

List<string> scoresList = new List<string>{"Jim:50","Ben:27", "John:28"};
var sorted = scoresList 
    .OrderBy(s => int.Parse(s.Substring(s.IndexOf(":") + 1)))
    .ToList();
0 голосов
/ 17 июня 2020

Чтобы использовать Sort, вам нужно написать класс «компаратора».

для сравнения leaderboardData напишите это:

 public class leaderboardDataComparer : IComparer<leaderboardData>

и используйте быстрые действия (Ctrl +.) Для реализовать отсутствующий метод.

 public int Compare([AllowNull] leaderboardData x, [AllowNull] leaderboardData y)
 {
 }

Затем напишите ваш журнал сравнения c:

 if (x.score > y.score) return 1;
 if (x.score < y.score) return -1;
 return 0;

для сравнения string данных, напишите это:

public class leaderboardStringDataComparer : IComparer<string>
{
     public int Compare([AllowNull] string x, [AllowNull] string y)
     {
          var xscore = Convert.ToInt32(x.Split(':')[1]);
          var yscore = Convert.ToInt32(y.Split(':')[1]);
          if (xscore > yscore) return 1;
          if (xscore < yscore) return -1;
          return 0;
     }
}

использование:

 scoresList.Sort(new leaderboardStringDataComparer());
0 голосов
/ 17 июня 2020

Похоже, вы сами создаете список, а затем хотите его отсортировать. Я бы рекомендовал выполнить сортировку до / при создании списка, что благодаря LINQ OrderBy() можно сделать очень легко:

foreach (var i in leaderboard.statDataList.OrderBy(x => x.score)) {
    // ...
}

Или, если вам нужно обратное порядок сортировки, используйте OrderByDescending():

foreach (var i in leaderboard.statDataList.OrderByDescending(x => x.score)) {
    // ...
}
0 голосов
/ 17 июня 2020

Вы должны сортировать по свойствам, а не только по сортировке Например, l.OrderBy(s => s.score) Также вы можете реализовать интерфейс IComparable, и .Sort будет работать Вы можете сделать это как

public class UserScore: IComparable<UserScore>
{
    public int Score {get; set;}

    public int CompareTo(UserScore other)
    {
        return Score.CompareTo(other.Score);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...