2013-02-22 18 views
-1

我有以下代碼..Int.Parse和排序

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」一起工作?

+0

請註明您的首選答案,一旦你感到滿意或給予反饋。 – 2013-02-25 09:25:32

回答

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轉換。如果你想允許其他的價值觀,你應該更具體地說明你將接受什麼。

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; 
} 

編輯:改變的解決方案,以考慮數字的字符串中的排序。

+2

'。ThenBy(a => a)'不會正確完成排序。 – Rawling 2013-02-22 10:57:41

+0

@Rawling代碼沒有修正F或D那是正確的。這是你的意思嗎? – 2013-02-22 11:01:27

+3

好吧,OP的代碼似乎很難將數字部分排序爲數字,而不是字符串(所以'2'在'10'之前,而不是之後)。 – Rawling 2013-02-22 11:05:00

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 … 
0

如果字符串總是以兩個字母開始,你也可以使用Substring(2)。要檢查是否有一個數字部分,你可以使用Enumerable.All(Char.IsDigit)(假設所有字符是前兩個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(); 

DEMO

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

          return y; 
         }); 
+1

這似乎是最好的方法,比我的'所有(Char.IsDigit)'方法+1 – 2013-02-22 11:23:39