按字母顺序排列2个小数点

时间:2017-08-04 09:08:00

标签: c# string sorting

我正在尝试按列表中的一个x对象中的值对列表进行排序。这是我需要的订单:

1
1.1
1.2
1.3
1.4
1.5
1.10
1.11
1.12
4.1
4.2
4.15

我尝试了以下内容:

var lRetItems = lExportItems.OrderBy(d => d.linkid*);

IEnumerable<item> lRetItems = 
from x in lExportItems
orderby x.linkid*
select x;

* linkid = string

但是没有给我我想要的顺序,因为这些方法1.10跟随1.1而不是1.2跟随1.1。以下是上述方法提供的错误排序的示例:

1
1.1
1.10
1.11
1.12
1.2
1.3
1.4
...

有没有人知道如何以与第一个例子相同的方式订购列表?

如果这是一个双倍而不是1.10将与1.1相同...因此上面的顺序。但我希望字符串至少按长度排序?

有没有人知道可以从这些字符串中提供我需要的orider的方法?

这是一个Rextester,显示我根据评论尝试的内容(这失败了):

http://rextester.com/JJB33165

感谢。

2 个答案:

答案 0 :(得分:3)

var result = lRetItems.OrderBy(x => Version.Parse(x));

您可以使用Version课程。

此处Rextester

中的现场演示

答案 1 :(得分:0)

您需要编写一个比较器函数,该函数将采用两个值,将它们除以点(。)并比较整数,然后再比较转换为int的小数部分。

然而,这将是低效的,因为花费大量时间将字符串解析为整数 - 每个项目多次,但作为一个开始,它将为您提供所需的。

    public static int Compare(string a, string b)
    {
        // Locate point (if exists)
        var pointA = a.IndexOf('.'); 
        if(pointA == -1)
            pointA = a.Length;
        var pointB = a.IndexOf('.'); 
        if(pointB == -1)
            pointB = a.Length;
        // Get integers
        var intA = int.Parse(a.Substring(0, pointA));
        var intB = int.Parse(b.Substring(0, pointA));
        if(intA == intB)
        {
            // Get fractionals
            intA = int.Parse(a.Substring(pointA+1));
            intB = int.Parse(b.Substring(pointB+1));
        }
        return intB-intA;
    }