c#列出包含数字orderby的字符串

时间:2014-11-10 05:19:39

标签: c# list sorting observablecollection

我有一系列距离字符串,如下所示:

1.3 km
20公里
44公里
22.5公里
26.7公里

目前我按照长度排序,然后按字母顺序排列"用:

  

listofdistances.OrderBy(x => x.Distance.Length).ThenBy(x =>   x.Distance)

这将给我一个如下命令的清单:
20公里
44公里
1.3公里
22.5公里
26.7公里

这就是代码的作用,我理解它。现在我想要一个解决方案来按实际距离对字符串进行排序,但我不知道如何实现它:
1.3公里
20公里
22.5公里
26.7公里
44公里

非常感谢任何帮助。

4 个答案:

答案 0 :(得分:4)

您可以创建自然排序相等比较器。

public class DistanceNaturalSort : IComparer<string>
{

    int IComparer<string>.Compare(string x, string y)
    {
        try
        {
            var valX = double.Parse(Regex.Match(x, @"\d+(\.\d+)?").Value);
            var valY = double.Parse(Regex.Match(y, @"\d+(\.\d+)?").Value);
            if (valX == valY)
                return 0;
            else if (valX < valY)
                return -1;
            else
                return 1;
        }
        catch (Exception)
        {
            return ((new CaseInsensitiveComparer()).Compare(y, x));
        }
    }

}

然后,您只需通过以下方式将比较器传递给第一个订单:

var comparer = new DistanceNaturalSort();
var sorted = listofdistances.OrderBy(x => x, comparer);

答案 1 :(得分:0)

您也可以在Linq中使用它

  string[] h = new string[] { "1.3 km","20 km","44 km","22.5 km","26.7 km" };
 h.Select(g => double.Parse(g.Trim().Split(' ')[0])).OrderBy(g => g).Select(x => x + " Km")>toList();

答案 2 :(得分:0)

如果总是有空格分割且单位总是相同

var v = ls.Select(x => x.Split(' '));
var v2 = v.OrderBy(x=>Convert.ToDouble(x[0]));
var v3 =  v2.Select(z=>z.Aggregate((x, y) => x.ToString() + " " + y));

答案 3 :(得分:-1)

请参阅以下内容,  我想你正在寻找的那个。

Alphanum Algorithm

&安培;

Java Comparator Implementation