Сортировать числа с десятичными числами, которые хранятся в строке

У меня есть числа, которые преобразуются в строку. например, у меня есть сумма 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

5 ответов

Решение

Передайте пользовательский компаратор в 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;
        }
    }
}

Вы можете сделать это в одну строку:

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

Это должно работать

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

Пытаться

OrderBy(х =>double.Parse(x.Amount))

Вы можете сортировать по свойству Length, которое обеспечит желаемый порядок. Например:

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

        sizes = sizes.OrderBy(x => x.Length);
Другие вопросы по тегам