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

c#列出包含orderby数字的字符串,c#,list,sorting,observablecollection,C#,List,Sorting,Observablecollection,我有一个距离字符串列表,如下所示: 1.3公里 20公里 44公里 22.5公里 26.7公里 目前,我按长度排序,然后按字母顺序排列: listofdistance.OrderBy(x=>x.Distance.Length)。然后是by(x=> x、 距离) 这将给我一个按如下顺序排列的列表: 20公里 44公里 1.3公里 22.5公里 26.7公里 这就是代码的作用,我理解它。现在我想要一个按实际距离对字符串排序的解决方案,但我不知道如何实现: 1.3公里 20公里 22.5公里 26.7

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

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

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

listofdistance.OrderBy(x=>x.Distance.Length)。然后是by(x=> x、 距离)

这将给我一个按如下顺序排列的列表:
20公里
44公里
1.3公里
22.5公里
26.7公里

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


非常感谢您的帮助。

请参考以下内容:, 我想你要找的那个

&


请参考以下内容, 我想你要找的那个

&


请参考以下内容, 我想你要找的那个

&


请参考以下内容, 我想你要找的那个

&


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

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));
        }
    }

}

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

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));
        }
    }

}

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

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));
        }
    }

}

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

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));
        }
    }

}

您也可以在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();

您也可以在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();

您也可以在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();

您也可以在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();

如果存在空间分割,则单位始终相同

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));

如果存在空间分割,则单位始终相同

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));

如果存在空间分割,则单位始终相同

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));

如果存在空间分割,则单位始终相同

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));

您可以通过设置来控制字符串的顺序。您可能需要创建自己的区域性。也许最好将距离存储在具有单位和值属性的类中。也许这个类还可以在单位之间转换,这样它甚至可以对混合米、公里和英里的列表进行正确排序。您可能需要创建自己的区域性。也许最好将距离存储在具有单位和值属性的类中。也许这个类还可以在单位之间转换,这样它甚至可以对混合米、公里和英里的列表进行正确排序。您可能需要创建自己的区域性。也许最好将距离存储在具有单位和值属性的类中。也许这个类还可以在单位之间转换,这样它甚至可以对混合米、公里和英里的列表进行正确排序。您可能需要创建自己的区域性。也许最好将距离存储在具有单位和值属性的类中。也许这个类还能够在单位之间进行转换,这样它甚至能够对混合了米、公里和英里的列表进行正确排序。