所以我在C#中有一个由字符串组成的列表,这些字符串由字符串和整数组成。例如,“ Jim:50”或“ Ben: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>();
}
}
感谢您的帮助,谢谢!
答案 0 :(得分:1)
您需要获取数字字符串并将其转换为整数。例如,如果保证您使用“字母” +“:” +“数字”格式,则可以执行以下操作:
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();
答案 1 :(得分:0)
您必须按属性排序,而不仅仅是排序
例如。 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);
}
}
答案 2 :(得分:0)
您似乎正在自己创建列表,然后要对其进行排序。我建议在创建列表之前/创建列表时进行排序,这要归功于LINQ OrderBy()
可以很容易地完成:
foreach (var i in leaderboard.statDataList.OrderBy(x => x.score)) {
// ...
}
或者,如果您需要相反的排序顺序,请使用OrderByDescending()
:
foreach (var i in leaderboard.statDataList.OrderByDescending(x => x.score)) {
// ...
}
答案 3 :(得分:0)
要使用Sort
,您需要编写一个“比较器”类。
要比较leaderboardData
,请这样写:
public class leaderboardDataComparer : IComparer<leaderboardData>
并使用快速操作(Ctrl +。)来实现缺少的方法。
public int Compare([AllowNull] leaderboardData x, [AllowNull] leaderboardData y)
{
}
然后编写比较逻辑:
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());