3

分割後の値でリストを並べ替えようとしています。

たとえば、私のデータは次のようになります。

Z|2  
A|1

リストを分割後の値で並べ替えたい

だから私は得るだろう

A|1  
Z|2  

これは私が使用しているものですが、エラーが発生します:

{"入力文字列は、正しい形式ではありませんでした。"}

All = All.OrderBy(s => int.Parse(s.Split('|')[1])).ToList();

どんな助けでも素晴らしいでしょう!ありがとう!

4

4 に答える 4

6

これはうまくいきます:

All = All.OrderBy(s => int.Parse(s.Split('|').Last())).ToList();

ただし、ダム文字列のリストの代わりに構造化された型のリストを使用すると、さらにうまくいくでしょう。たとえば、リストを作成Tuple<string, int>して、2 番目のメンバーで単純に並べ替えることができます。タプルを順序付けられたコンテナーに入れて、ソートを自動的に行うこともできます。

于 2013-03-28T14:53:07.663 に答える
1

最初に無効な形式をスキップする必要があります。先頭に置くと仮定します。

All = All.OrderBy(s => {
    var parts = s.Split('|');

    if (parts.Length != 2)
        return int.MinValue;

    int value;
    if (int.TryParse(parts[1], out value))
        return value;

    return int.MinValue;
});
于 2013-03-28T14:51:49.760 に答える
1

TryParseよくわからない値がある場合に使用できます。これにより、解析できない値がリストの最後に配置されます。

All = All.OrderBy(s => {
  int value;
  if (!Int32.TryParse(s.Split('|')[1], out value)) {
    value = Int32.MaxValue;
  }
  return value;
}).ToList();

(注: 可能な最大の int 値を使用して、これらのアイテムをリストの最後に配置します。値が 2147483648 の他のアイテムがある場合、それらはそれらと混合されます。その値でも機能するソリューションの場合は、文字列から値を抽出するだけのデリゲートではなく、比較子を作成する必要があります。)

于 2013-03-28T15:00:30.460 に答える
0

コードは問題ありません。無効なデータが必要です。最初のリストの値を再確認して、パイプの後に数値以外の値がないこと、またはそのようなものがないことを確認してください。

編集

次のように、いつでもエラーをキャッチして別の方法で処理できます。

// This would put all failures at the top of the list
All = All.OrderBy(s => {
    try { return int.Parse(s.Split('|')[1]); }
    catch { return 0; }
}).ToList();
于 2013-03-28T14:53:34.340 に答える