簡體   English   中英

C#列出包含數字orderby的字符串

[英]c# list strings with containing numbers orderby

我有一個距離字符串列表,如下所示:

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

目前,我按長度排序,然后按字母順序排列:

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

這將給我一個排序如下的列表:
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));
        }
    }

}

然后,您可以通過以下方式將比較器傳遞給第一階:

var comparer = new DistanceNaturalSort();
var sorted = listofdistances.OrderBy(x => x, comparer);

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

請參考以下內容,我想您正在尋找的那個。

Alphanum Algorithm

Java Comparator Implementation

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM