【问题标题】:Sort numbers with decimals that are stored in string使用存储在字符串中的小数对数字进行排序
【发布时间】:2016-04-20 14:10:56
【问题描述】:

我有正在转换为字符串的数字。 例如,我有一个金额 20000,我必须将其显示为 200.00,所以我正在执行

string Amount = $"{Convert.ToDouble(x.Amount) / 100:0.00}"     

然后我将它们存储到具有值的金额列表中

200.00、30.00、588888.00、56.36、

我尝试按orderby(x=>x.Anount) 对其进行排序,但这是根据第一个数字为的字符串排序的

200.00, 30.00, 56.36, 58888.00

我希望输出排序为

30.00, 56.36, 200.00, 588888.00

【问题讨论】:

  • 在转换为字符串或OrderBy(x => double.Parse(x.Amount))之前排序
  • 嗯,我有一个排序页面,我使用 ajax 调用根据每个排序函数进行排序。存储在字符串中后还有其他选项可以转换吗?

标签: c# .net linq sorting stable-sort


【解决方案1】:

将自定义比较器传递给 OrderBy。 Enumerable.OrderBy 会让你指定任何你喜欢的比较器。

void Main()
{
    string[] decimals = new string[] { "30.00", "56.36", "200.00", "588888.00" };

    foreach (var dec in decimals.OrderBy(x => x, new DecimalComparer()))
    {    
        Console.WriteLine(thing);
    }
}


public class DecimalComparer: IComparer<string>
{
    public int Compare(string s1, string s2)
    {
        if (IsDecimal(s1) && IsDecimal(s2))
        {
            if (Convert.ToDecimal(s1) > Convert.ToDecimal(s2)) return 1;
            if (Convert.ToDecimal(s1) < Convert.ToDecimal(s2)) return -1;
            if (Convert.ToDecimal(s1) == Convert.ToDecimal(s2)) return 0;
        }

        if (IsDecimal(s1) && !IsDecimal(s2))
            return -1;

        if (!IsDecimal(s1) && IsDecimal(s2))
            return 1;

        return string.Compare(s1, s2, true);
    }

    public static bool IsDecimal(object value)
    {
        try {
            int i = Convert.ToDecimal(value.ToString());
            return true; 
        }
        catch (FormatException) {
            return false;
        }
    }
}

【讨论】:

  • int i = Convert.ToDecimal(value.ToString()); ?? Decimal.TryParse 可能比捕获和错误更有效
  • 完全同意。这是一个简单的例子。但是,毫无疑问,我可以写得更有效率。
  • 还将Convert.ToDecimal 移出if 语句并将结果保存在一个变量中然后重复使用该变量3 次将是另一个改进
【解决方案2】:

试试

orderby(x=>double.Parse(x.Amount))

【讨论】:

    【解决方案3】:

    这应该可行

    var numberstring = "100.0,300.00,200.00,400.00";
    var array = numberstring.Split(',');
    var sortedstring = array.OrderBy(x => double.Parse(x)).Aggregate("", (current, val) => current + (val + ","));
    

    【讨论】:

      【解决方案4】:

      你可以在一行中完成:

              var orderedAsString =
                  amounts.Select(x => double.Parse(x.Amount) / 100)
                      .OrderBy(x => x)
                      .Select(x => x.ToString("0.00"));
      

      【讨论】:

        【解决方案5】:

        您可以按提供所需顺序的 Length 属性进行排序。例如:

                IEnumerable<string> sizes = new List<string> { "200.00", "30.00", "56.36", "58888.00" };
        
                sizes = sizes.OrderBy(x => x.Length);
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-02-13
          • 2012-11-14
          • 2015-12-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-08-29
          相关资源
          最近更新 更多