【问题标题】:c# list strings with containing numbers orderbyc# 列出包含数字的字符串
【发布时间】:2014-11-10 05:19:39
【问题描述】:

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

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

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

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

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

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

非常感谢任何帮助。

【问题讨论】:

  • 您可以通过设置culture in an overload of OrderBy来控制字符串的顺序。您可能需要创建自己的文化。
  • 也许将距离存储在具有 unit 和 value 属性的类中会更好。也许这个类也能够在单位之间进行转换,以便它甚至能够正确地对混合了米、公里和英里的列表进行排序。

标签: c# list sorting observablecollection


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      如果总是有空间分割并且单位总是相同的

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

      【讨论】:

        【解决方案4】:

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

        Alphanum Algorithm

        &

        Java Comparator Implementation

        【讨论】:

          猜你喜欢
          • 2018-12-18
          • 2012-04-23
          • 1970-01-01
          • 1970-01-01
          • 2014-10-18
          • 2014-04-17
          • 2014-11-06
          • 1970-01-01
          • 2016-08-02
          相关资源
          最近更新 更多