.net 如何在c#中排序权重

5w9g7ksd  于 2023-01-03  发布在  .NET
关注(0)|答案(3)|浏览(279)

我有一个List<string>的数组列表,它包含的值的顺序是[100g, 1.5kg, 250g],现在当我试图排序它们时,我没有得到预期的结果,它是按以下顺序排序的。
我使用的是array.OrderBy(x => x);

[1.5kg, 100g, 250g]

我怎样才能按重量把它们分类呢?
正确答案应该是:

[100g, 250g, 1.5kg]
dy2hfwbg

dy2hfwbg1#

可以将所有数组元素归一化为g。然后按数字排序,最后转换为g或kg。
样本代码:

private string[]  normalaizeArray(string[] inputArray)
    {
        for (int i= 0 ; i < inputArray.Length; i++)
        {
            if(inputArray[i].Contains('k'))
            {
                inputArray[i] = (float.Parse(inputArray[i].Split('k')[0]) * 1000).ToString();
            }
            else
            {
                inputArray[i] = inputArray[i].Replace("g", "");
            }
        }
        inputArray = inputArray.OrderBy(x => int.Parse(x)).ToArray();
        for (int i = 0; i < inputArray.Length; i++)
        {
            if(int.Parse(inputArray[i])>1000)
                inputArray[i] = (float.Parse(inputArray[i])/1000).ToString() + "kg";
            else
                inputArray[i] = inputArray[i] + 'g';
        }
        return inputArray;
    }


希望这有帮助!

zzoitvuj

zzoitvuj2#

尝试解析到g并排序

public void GOGO()
{
    List<string> ay = new List<string>()
    {
        "1.5kg","100g","1600g"
    };
    IOrderedEnumerable<string> orderList = ay.OrderBy(x => WeightG(x));
    foreach(string s in orderList)
    {
        Console.WriteLine(s);//here
    }
}

public int WeightG(string weighStr)
{
    if (weighStr.Contains("kg"))
    {
        string num = weighStr.Split('k')[0];
        return (int)(float.Parse(num) * 1000);
    }

    if (weighStr.Contains("g"))
    {
        string num = weighStr.Split('g')[0];
        return int.Parse(num);
    }

    return 0;
}
k5ifujac

k5ifujac3#

我有一个更简单、更优雅的解决方案,代码更少:

string[] a = new string[] { "7.2kg", "1.5kg", "100g", "250g" };
var lstKg = a.ToList().Where(x => x.Contains("kg")).Select(y => double.Parse(y.Replace("kg", String.Empty))).OrderBy(k=>k).Select(o=>o+"kg").ToList();
var lstG = a.ToList().Where(x => !lstKg.Contains(x)).Select(y => double.Parse(y.Replace("g", String.Empty))).OrderBy(k=>k).Select(o =>o+"g").ToList();
lstG.AddRange(lstKg);
lstG.ForEach(item => Console.WriteLine(item));

相关问题