背景:我正在设计一个排行榜,并希望将数据从最高分显示到最低分。问题是数据包含从文本文件导入的字符串和整数。目前我能够以数字方式对数据进行排序,但是我使用的OrderByDescending函数不起作用。例如,当订购时为11,4,5,8,23,65 = 8,65,5,4,23,11(按字母数字排序)。 该列表包含数据:name(字符串),难度(字符串)和score(int),我希望按降序对数据进行排序:E.g 1st = 10,2nd = 9 etc.
List<string> leaderboardList = new List<string>();
StreamReader srUserData = new StreamReader(@"User Leaderboard.txt");
while ((userDataLine = srUserData.ReadLine()) != null)
{
leaderboardList.Add(userDataLine);
}
leaderboardList = leaderboardList.OrderByDescending(x => Regex.Match(x, @"\d+").Value).ToList();
Regex.Match在字符串中查找数字。 基本上最后一行是需要修改的行。 欢迎大家帮助,谢谢。
编辑:数据应以名称,难度,分数的形式输出,并按降序对数据进行排序。
答案 0 :(得分:2)
只需改变:
leaderboardList = leaderboardList.OrderByDescending(x =>
Regex.Match(x, @"\d+").Value).ToList();
要:
leaderboardList = leaderboardList.OrderByDescending(x =>
Int32.Parse(Regex.Match(x, @"\d+").Value)).ToList();
真的只需添加Int32.Parse。但需要注意的是:如果传递的字符串不是数字Int32.Parse()
,则会抛出异常。如果这是一种需要处理的可能性,那么您可以改为使用Int32.TryParse。
例如:
int testValue = 0; //This is only used for TryParse()
leaderboardList = leaderboardList.OrderByDescending(x =>
Int32.TryParse(Regex.Match(x, @"\d+").Value, out testValue)
? testValue : 0M).ToList();
使用以下示例列表进行测试:
List<string> leaderboardList = new List<string>();
leaderboardList.Add("Brandon|Easy|9");
leaderboardList.Add("Yoda|Impossible|9001");
leaderboardList.Add("Barney|Easy|-1");
leaderboardList.Add("John|Normal|500");
此代码正常运行,不需要TryParse代码。
输出:
Yoda|Impossible|9001
John|Normal|500
Brandon|Easy|9
Barney|Easy|-1
答案 1 :(得分:2)
我建议采用与众不同的方法。从磁盘加载字符串,然后将其解析为已定义的类。例如:
public class LeaderboardRow
{
public string Name { get; set; }
public string Difficulty { get; set; }
public int Score { get; set; }
}
然后你的代码看起来会更像这样:
List<LeaderboardRow> leaderboardList = new List<LeaderboardRow>();
StreamReader srUserData = new StreamReader(@"User Leaderboard.txt");
while ((userDataLine = srUserData.ReadLine()) != null)
{
//Put logic here that parses your string row into 3 distinct values
leaderboardList.Add(new LeaderboardRow()
{
Score = 0, //put real value here
Name = string.Empty, //put real value here
Difficulty = string.Empty //put real value here
});
}
然后你需要做的任何命令都是一个简单的LINQ语句:
leaderboardList = leaderboardList.OrderByDescending(x => x.Score).ToList();
根据您的方案/要求,您可以将此文本存储为json,这可以加快并简化您的应用程序。
答案 2 :(得分:0)
你可以去旧学校并执行Integer.TryParse或这些功能的衍生物。完成后,您可以将它们附加到整数列表中。
int number;
bool result = Int32.TryParse(value, out number);
if (result) {
Console.WriteLine("Converted '{0}' to {1}.", value, number);
}
答案 3 :(得分:0)
你错过了一件事,就是你没有将Regex值转换为int。请检查下面的代码,它适用于我。
CODE:
List<string> leaderboardList = new List<string>();
leaderboardList.Add("A,A,9");
leaderboardList.Add("B,B,8");
leaderboardList.Add("G,C,65");
leaderboardList.Add("S,B,10");
leaderboardList = leaderboardList.OrderByDescending(x =>Convert.ToInt32((string.IsNullOrEmpty(Regex.Match(x, @"\d+").Value)?"0":Regex.Match(x, @"\d+").Value))).ToList();
foreach (var item in leaderboardList)
{
Console.WriteLine(item);
}
在线输出:.Net Fiddle Output
答案 4 :(得分:0)