C# 使用存储在字符串中的小数对数字进行排序

C# 使用存储在字符串中的小数对数字进行排序,c#,.net,linq,sorting,stable-sort,C#,.net,Linq,Sorting,Stable Sort,我有一些正在转换为字符串的数字。 例如,我有一个20000,我必须显示为200.00,所以我正在执行 string Amount = $"{Convert.ToDouble(x.Amount) / 100:0.00}" 然后我将它们存储到带有值的金额列表中 200.00,30.00,58888.00,56.36 我尝试按orderbyx=>x.Anount对其进行排序,但这是基于第一个数字为的字符串进行排序的 200.00,30.00,56.36,58888.00 我希望输出按以下顺

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

string Amount = $"{Convert.ToDouble(x.Amount) / 100:0.00}"     
然后我将它们存储到带有值的金额列表中

200.00,30.00,58888.00,56.36

我尝试按orderbyx=>x.Anount对其进行排序,但这是基于第一个数字为的字符串进行排序的

200.00,30.00,56.36,58888.00

我希望输出按以下顺序排序:

30.00, 56.36, 200.00, 58888.00

试一试


orderbyx=>double.Parsex.Amount

将自定义比较器传递给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;
        }
    }
}
这应该行得通

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 + ","));

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

        IEnumerable<string> sizes = new List<string> { "200.00", "30.00", "56.36", "58888.00" };

        sizes = sizes.OrderBy(x => x.Length);

您可以在一行中完成:

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

在转换为string或OrderByx=>double.Parsex.amount之前进行排序。我有一个排序页面,在该页面中使用ajax调用根据每个排序函数进行排序。在存储到字符串中之后,是否还有其他选项可以转换它?int i=convert.ToDecimalvalue.ToString??Decimal.TryParse可能比捕获和出错更有效。这是一个简单的例子。但是,毫无疑问,我可以更高效地编写。另外,将Convert.ToDecimal移出if语句,并将结果保留在变量中,然后将该变量重用3次将是另一个改进