-1

私は次のコードを持っています..

var strings = new[] { 
"FD1","FD5","FD10","FD102","FD105","FD10","FD32","FD80", "FD31", "FD21", "FDnon"
};
        strings = strings.Select(str => new
        {
            str,
            num = int.Parse(String.Concat(str.Trim('F', 'D'))),
        })
        .OrderBy(x => x.num)
        .Select(x => x.str)
        .ToArray();

ただし、「FDnon」になると数字が入っていないため失敗します。

一番上にソートされた「FDnon」でこれを機能させるにはどうすればよいですか?

4

5 に答える 5

1
var result = strings.OrderBy(x =>
                         {
                             int y = int.MinValue;
                             int.TryParse(x.Substring(2), out y);

                             return y;
                         });
于 2013-02-22T11:11:33.720 に答える
1

カスタム順序が必要な場合は、カスタム SortMethod を指定します

var sorted = strings
.OrderBy(SpecialSort)
.ToList();

public static int SpecialSort(string value)
{
    int sortOrder = 0;
    string numberPart = value.Trim('F', 'D');
    int.TryParse(numberPart, out sortOrder);
    return sortOrder;
}

編集:文字列内の数値の並べ替えを考慮してソリューションを変更しました。

于 2013-02-22T10:52:25.537 に答える
0

FDnon を上部に表示したい場合は、次のようなものを使用できます。

strings = strings.Select(str => new
    {
        str,
        num = str=="FDnon" ? Int32.MaxValue : Int32.Parse(String.Concat(str.Trim('F', 'D')))
    })
    .OrderBy(x => x.num)
    .Select(x => x.str)
    .ToArray();

FDnonこのコードは変換をスキップするだけです。他の値を許可したい場合は、何を受け入れるかをより具体的にする必要があります。

于 2013-02-22T10:51:35.447 に答える
0

FDnon最後にソートされる整数値に変換する、より洗練された解析が必要です(この場合Int32.MaxValueはそうなります)。

何かのようなもの:

var res = strings.Select(s => {
            var numPart = s.Trim('F', 'D');
            var i;
            if (!Int32.TryParse(numPart, out i)) {
               i = Int32.MaxValue;
            }
            return new {
              str = s,
              num = i
            };
          }.OrderBy …
于 2013-02-22T10:54:03.823 に答える
0

文字列が常に 2 文字で始まる場合は、Substring(2). 数値部分があるかどうかを確認するには、次を使用できますEnumerable.All(Char.IsDigit)(すべての文字が最初の2つのlewttersの後の数字であると想定しています):

strings = strings.Select(str => new
{
    str,
    num = str.Substring(2).All(Char.IsDigit) ? int.Parse(str.Substring(2)) : int.MinValue
})
.OrderBy(x => x.num)
.Select(x => x.str)
.ToArray();

デモ

于 2013-02-22T10:56:50.997 に答える