我正在尝试按列表中的一个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,显示我根据评论尝试的内容(这失败了):
感谢。
答案 0 :(得分:3)
答案 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;
}