[英]Sort a list consisting of strings made up of strings and integers
所以我在 C# 中有一个由字符串和整数组成的字符串组成的列表。 例如,“吉姆:50”或“本:27”。 我希望能够使用 integer 对这个列表进行排序,但我不知道从哪里开始。 我当前的代码:
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>();
}
}
任何帮助表示赞赏,谢谢!
您需要获取数字字符串并将其转换为 integer。 例如,如果您保证格式为“字母”+“:”+“数字”,则可以执行以下操作:
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();
您必须按属性排序,不仅 Sort Eg 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);
}
}
看起来您正在自己创建列表,然后您想要对其进行排序。 我建议在创建列表之前/创建列表时进行排序,这要归功于 LINQ OrderBy()
可以很容易地完成:
foreach (var i in leaderboard.statDataList.OrderBy(x => x.score)) {
// ...
}
或者,如果您需要相反的排序顺序,请使用OrderByDescending()
:
foreach (var i in leaderboard.statDataList.OrderByDescending(x => x.score)) {
// ...
}
要使用Sort
,您需要编写一个“比较器”class。
比较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());
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.