从高到低c#对数据列表(字符串)进行排序

时间:2017-03-09 20:22:02

标签: c# sorting

背景:我正在设计一个排行榜,并希望将数据从最高分显示到最低分。问题是数据包含从文本文件导入的字符串和整数。目前我能够以数字方式对数据进行排序,但是我使用的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在字符串中查找数字。 基本上最后一行是需要修改的行。 欢迎大家帮助,谢谢。

编辑:数据应以名称,难度,分数的形式输出,并按降序对数据进行排序。

5 个答案:

答案 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)

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

The Alphanum Algorithm

我希望这适合你。