2017-03-09 34 views
1

上下文:我正在设计一个排行榜,并希望将数据从最高分数显示到最低分数。问题是数据包含从文本文件导入的字符串和整数。目前我能够对数据进行数字排序,但是我使用的OrderByDescending函数不起作用。订购时,例如11,4,5,8,23,65 = 8,65,5,4,23,11(按字母顺序排序)。 该列表中包含的数据:名称(字符串),困难(字符串)和得分(int)和我想以降序排序数据:例如第一= 10,第二= 9等从数字上从高到低对列表(字符串)进行排序c#

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找到字符串中的数字。 基本上最后一行是需要修改的行。 欢迎所有帮助,谢谢。

编辑:数据应以形式输出名称,难度,得分和排序数据以降序排列,得分最高。

+1

这个数据你会执行多个功能吗?为什么不将数据一次解析成具有单独属性的类?这样你就可以解析数据一次,然后在本机类型上执行各种函数(排序,字符串操作等) – maccettura

回答

1

只是改变:

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代替。

例:

​​

使用下面的示例列表测试:

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 
+0

在mscorlib.dll中发生未处理的类型'System.FormatException'异常 –

+0

排行榜列表中的数据包括一个名字,一个难度,例如easy,然后是数字 –

+0

@OranPower查看我在编辑中用于测试的示例列表。这与您输入的数据是否相符? –

0

你可以去老同学和执行Integer.TryParse或者这些功能的某些衍生物。一旦你这样做,你可以将它们追加到整数列表中。

int number; 
bool result = Int32.TryParse(value, out number); 
if (result) { 
Console.WriteLine("Converted '{0}' to {1}.", value, number); 
} 
0

你错过了一两件事,那就是你是不是正则表达式转换价值为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

+0

错误:输入字符串格式不正确。 –

+0

你能分享你的样本数据吗?这将有助于解决这个错误。 – csharpbd

+0

输入:例如ORAN阿森纳硬3 –

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,这样可以加速并简化您的应用程序。

0

您可以使用此命令来排序字符串中的数字列表或包含数字的字符串列表。

The Alphanum Algorithm

我希望这对你的作品。

相关问题