2017-02-08 3 views
1

私はIntのリストをStringとして保存しており、それらを注文したいと思います。 私は、次の解決策を考え出した:それは完璧に動作しますが、リストだけ番号が含まれている場合にのみ文字列をintに変換したリストで並べ替え

sortList = sortList.OrderByDescending(x => Convert.ToInt32(x.Number)).ToList(); 

。たとえば、「???」のような文字列が1つ存在する場合、並べ替えは完全に失敗します。

期待:

['313', '309', '119', '49', '???'] 

結果:

['309' '49' '313' '119' '???'] 
+1

'x.Number'は何ですか? –

+0

x.Numberはオブジェクト内の文字列です。 – zperee

+0

出力に文字列のようなものが表示されますが、文字列には 'Number'プロパティがありません。オブジェクトがある場合、出力は '[{Number:" 309 "}、{Number:" 49 "} ...]のようになります。 –

答えて

4

ですから、int.TryParse()を使用すると、無効な文字列の低値を返す必要があります。

sortList = sortList.OrderByDescending(x => 
    { 
     int i; 
     return int.TryParse(x.Number, out i) ? i : int.MinValue; 
    }); 

私はOrderByDescendingの代わりOrderByを使用あなたが示した期待通りの結果降順です。

C# 7
+2

彼は "???"最後にMinValueをMaxValueに変更します –

+0

@MaksimSimkin彼の期待は降順です –

+0

はい、あなたの権利は、申し訳ありません:) –

3

まだTryParse()を使用している間、あなたはout-variablesを使用することにより、1行だけにこれを減らすことができます。

sortList = sortList.OrderBy(x => Int32.TryParse(x.Number, out var i) ? i : Int32.MinValue).ToList(); 
+1

@HimBromBeere:もう宣言する必要はありません。 https://docs.microsoft.com/en-us/dotnet/articles/csharp/csharp-7#out-variables現時点では、悪い習慣があると思われるLINQクエリの(ローカル)変数を変更する必要があるため、大きな改善点です –

関連する問題