我有一个List<string>的数组列表,它包含的值的顺序是[100g, 1.5kg, 250g],现在当我试图排序它们时,我没有得到预期的结果,它是按以下顺序排序的。我使用的是array.OrderBy(x => x);
List<string>
[100g, 1.5kg, 250g]
array.OrderBy(x => x);
[1.5kg, 100g, 250g]
我怎样才能按重量把它们分类呢?正确答案应该是:
[100g, 250g, 1.5kg]
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; }
希望这有帮助!
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; }
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));
3条答案
按热度按时间dy2hfwbg1#
可以将所有数组元素归一化为g。然后按数字排序,最后转换为g或kg。
样本代码:
希望这有帮助!
zzoitvuj2#
尝试解析到g并排序
k5ifujac3#
我有一个更简单、更优雅的解决方案,代码更少: