【问题标题】:Sorting a list (string) numerically from high to low c#从高到低对列表(字符串)进行数字排序c#
【发布时间】:2017-03-09 20:22:01
【问题描述】:

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

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 在字符串中查找数字。 基本上最后一行是需要修改的行。 欢迎大家帮忙,谢谢。

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

【问题讨论】:

  • 您将使用这些数据执行多种功能吗?为什么不将数据解析为具有单独属性的类?这样你就可以解析一次数据,然后对原生类型执行各种功能(排序、字符串操作等)

标签: c# sorting


【解决方案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

例如:

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

【讨论】:

  • 在 mscorlib.dll 中发生了“System.FormatException”类型的未处理异常
  • 排行榜列表中的数据包括名称、难度例如容易,然后是数字
  • @OranPower 请参阅我在编辑中测试过的示例列表。这与您输入的数据匹配吗?
  • 谢谢,使用 TryParse 效果很好。我只是想知道以下代码行之间的区别是什么,因为底部代码行不通: leaderboardList = leaderboardList.OrderByDescending(x => Int32.TryParse(Regex.Match(x, @"\d+").Value, out testValue)? testValue : 0M).ToList(); leaderboardList = leaderboardList.OrderByDescending(x => Int32.Parse(Regex.Match(x, @"\d+").Value)).ToList();
  • 如果您的输入格式不正确,@OranPower TryParse 不会引发异常。相反,它将返回 false。本质上,Int32.Parse 要求您的输入是数字的字符串表示形式。如果不是数字,则会引发异常。更多信息here
【解决方案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,而不是这样可以加快和简化您的应用程序。

【讨论】:

    【解决方案3】:

    您可以去老学校执行 Integer.TryParse 或此类函数的某些派生。完成后,您可以将它们附加到整数列表中。

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

    【讨论】:

      【解决方案4】:

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

      The Alphanum Algorithm

      我希望这对你有用。

      【讨论】:

        【解决方案5】:

        您错过了一件事,那就是您没有将 Regex 值转换为 int。请检查下面的代码,它对我有用。

        代码:

        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

        【讨论】:

        • 你能分享你的样本数据吗?这将有助于解决这个错误。
        • 输入:例如 ORAN Arsenal Hard 3
        • 然后是不同的名字,然后是足球队,然后是难度,然后是他们的分数
        • 请查看我的fiddle output。如果您的数据总是有分数,那么它将起作用。
        • 分数是否有可能为空?
        猜你喜欢
        • 2021-02-17
        • 2016-03-19
        • 2015-08-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-03-26
        相关资源
        最近更新 更多