2017-02-21 15 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

あなたは(数字だけで両方doubledecumalあり、そのような番号の短すぎる、例えばDecimal.MaxValue == 79228162514264337593543950335)あなたがBigIntegerにそれらを解析することができ整数で作業している場合:

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

負の整数を持っていれば、2つのパスでそれを分割して2つの配列をマージすることができます –

+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 answerからコピーして貼り付けたもので、50 +数字の数字ではありません。 – gagro

0

その後、無カンマで彼らは(何も先頭のゼロ)をトリミングしていないしている正の整数と仮定すると:長い別のトリミングされていない数よりもトリミングされていない整数は、それよりも大きくなるので、

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

が働くだろう。あまりにもネガ用

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

真の前にソート偽ブール以来、あなたは-で始まる文字列はしないものの前に来てほしいです。

物事はそれよりももっと複雑であれば、私はCompare方法でIEqualityComparer<string>を使用したい:一つだけの-を持っていた、それが最初に来る場合

  1. そうでない場合は、両方とも-である場合は、-をトリムして、結果を呼び出してその結果を否定します。
  2. 何千ものグループ(英語使用の場合は,)を削除します。
  3. 小数点の桁区切り文字(英語では.)をそれぞれ、または全長で取得します(存在しない場合)。異なる場合、最短は最小です。
  4. 序数比較。
+0

BigIntegerの代わりにdoubleを使用したのは、doubleが大きな数値を処理できないためです。 BigIntegerにdoubleを変更すると問題が解決します。 – gagro

関連する問題