2017-02-21 59 views
0

我有包含50個數字的字符串數組。我需要將它們轉換爲真實世界的整數並命令它們提升。它的工作原理,當我有一個數字不同大小的數的數字,但在這種情況下具有相同的數位大小數都數它不會工作:排序數組中的50個數字

string[] unsorted = {"324141241413213123123123132131451231231321363435243321413153412465745238454211425241244252423234234", "324141241413213123123123132131451231231321363435243321413153412465745238454211425241244252423234235" 
     ,"324141241413213123123123132131451231231321363435243321413153412465745238454211425241244252423234200","324141241413213123123123132131451231231321363435243321413153412465745238454211425241244252423234100","324141241413213123123123132131451231231321363435243321413153412465745238454211425241244252423234731"}; 
var sorted = unsorted.OrderBy(s => double.Parse(s)); 

什麼是最好的解決方案?

+1

什麼樣的測試用例沒有通過? – epascarello

+0

什麼樣的數字,可以解析爲BigInteger的東西? – harold

+0

你有幾個例子的數字? – mmenschig

回答

3

如果您正在使用整數你可以把它解析到BigInteger(包括doubledecumal太短對於這樣的數字,例如Decimal.MaxValue == 79228162514264337593543950335這是隻有位)工作:

using System.Numerics; 

... 

string[] data = ... 

var ordered = data 
    .OrderBy(item => BigInteger.Parse(item)) 
    .ToArray(); // if you want materialization to array 

如果您使用的是非負整數,您可以按照長度對它們進行排序,然後按字典順序排列(無需轉換):

string[] data = ... 

var ordered = data 
    .OrderBy(item => item.Length) 
    .ThenBy(item => item) 
    .ToArray(); // if you want materialization to array 

任何整數(見傑森P Sallinger的評論)同樣的方法也可以,但不是優雅的:

var ordered = data 
    .Where(item => item.StartsWith("-")) 
    .OrderByDescending(item => item.Length) 
    .ThenByDescending(item => item) 
    .Concat(data 
     .Where(item => !item.StartsWith("-")) 
     .OrderBy(item => item.Length) 
     .ThenBy(item => item)) 
    .ToArray(); 

最後,請看看 Natural Sort Order in C#

+1

如果你確實有負整數,你可以拆分集合,做兩遍,然後合併兩個數組 –

+0

@Jason P Sallinger:謝謝,我明白了!但是這個想法的實施將會非常複雜。 –

+0

爲真。至少這將是向自動防故障方向邁出的一步 –

-1

嘗試這個; (一個簡單的linq解決方案)它適用於正整數和負整數。

string[] array = { "2525213", "2525211", "-2525214" }; 

     var result = array.OrderBy(x => BigInteger.Parse(x)); 

     foreach (var item in result) 
     { 
      Console.WriteLine(item); 
     } 
    } 
+0

那麼,這基本上是從@Dmitry的答案複製和粘貼,而那些不是50 +數字的數字。 – gagro

0

假設他們修剪(沒有前導零)正整數,沒有逗號,那麼:

unsorted.OrderBy(s => s.Length).ThenBy(s => s) 

會的工作,因爲修剪整數,它比其他修剪數量不再會比它大。

對於底片太:

unsorted.Order(s => s[0] != '-').ThenBy(s => s.Length).ThenBy(s => s) 

由於布爾之前真排序錯誤的,你想要的字符串開始-來那些不前。

如果事情比我會用一個IEqualityComparer<string>與一個Compare方法更加複雜:

  1. 如果只有一個有-那麼它是第一位的。
  2. 否則,如果他們都有-然後削減-,調用自己的結果,然後否定該結果。 (,英文使用)。
  3. 如果沒有,則獲取每個或全部長度的小數點分隔符(.英文版)。如果不同,最短是最小的。
  4. 序號字符串比較。
+0

問題是我用double來代替BigInteger,因爲double不能處理那些大數字。將Double更改爲BigInteger可以解決問題。 – gagro