按照2位小数对字符串列表进行排序

3
我正在尝试按照列表中一个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 = 字符串

但是这些方法都不能按照我想要的顺序进行排序,比如1.10会在1.1之后而不是在1.2之后。以下是上述方法提供的错误排序示例:

1
1.1
1.10
1.11
1.12
1.2
1.3
1.4
...

有人知道如何按照第一个示例的顺序对列表进行排序吗?

如果这是双倍,则1.10将与1.1相同...因此上面的排序。但我希望至少按长度对字符串进行排序?

是否有人知道一种方法可以从这些字符串中提供所需的排序?

这里是一个 Rextester,显示了我基于评论尝试过的内容(失败了):

http://rextester.com/JJB33165

谢谢。


rextester中的代码有两个问题。"1,", "2"必须替换为"1.0", "2.0"或类似内容。次版本是必需的。一旦您解决了这个问题,它就可以正确地排序版本号。 - Andrew
很遗憾,我无法避免1和1.1并列存在,它必须是这样的,因此似乎那个特定的解决方案行不通。 - Dan Hall
我猜你不能用1.0代替1,对吗?小数点前的数字可以有多于1位吗?你可以创建一个新类,该类接收字符串并将其内部存储为两个整数,并实现IComparable。这可能是一个不错的方法(类似于其他先前链接问题中的方法)。 - Andrew
丹,你能解决这个问题吗? - Andrew
2个回答

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

您可以使用 版本 类。

这里有一个在Rextester上的实时演示。


lRetItems.OrderBy(x => new Version(x)); 也可以工作。 - Tetsuya Yamamoto
@TetsuyaYamamoto 是的,这是另一种可能性。 - mybirthname
所以我尝试了这个,但它给了我一个疯狂的排序!8.9 - 8.7 - 8.2 - 9。这是在一组字符串上进行的,并且这些字符串是同时从1...1.10 - 2...2.10等填充的。 - Dan Hall
http://rextester.com/JJB33165 - Dan Hall
1
很棒的解决方案,运行良好。 - jack
显示剩余2条评论

0
你需要编写一个比较函数,它将接收两个值,通过点(.)将它们分隔开,并在比较转换为整数的小数部分之前先比较整数部分。
然而,这将是低效的,因为会花费很多时间将字符串解析为整数 - 对于每个项目都需要多次解析。但是,作为开始,它可以帮助你得到你想要的结果。
    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;
    }

我接受@mybirthname的解决方案,使用“Version”类。代码重用等等。然而,最优化的版本是先将所有字符串转换(解析)为“Version”类,然后进行排序。 - Chris Walsh
很遗憾,它失败了:http://rextester.com/JJB33165 - Dan Hall
@DanHall,"它失败了"是指“其他”答案中的Version.Parse(x)示例而不是我在这里的示例吗? - Chris Walsh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接