2013-06-24 114 views
1

我有串如何排序此字符串升序字母數字

var strTest = new List<string> { "B2", "B1", "B10", "B3" }; 

我想如下「B1,B2,B3,B10」對它們進行排序的下面的列表。

如果我使用LINQ排序依據它按這種方式 「B1,B10,B2,B3」

請幫助。這是我的代碼。

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace SortingDemo 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      var strTest = new List<string> { "B2", "B1", "B10", "B3" }; 
      var sort = strTest.OrderBy(x => x); 
      var sortedStr = string.Join(",", sort); 
      Console.WriteLine(sortedStr); 
      Console.ReadLine(); 
     } 
+0

也看看這裏的答案:http://stackoverflow.com/questions/248603/natural-sort-order-in-c-sharp和在這裏:http://stackoverflow.com/questions/1323550/linq和自然排序順序 –

回答

4

試試這個:

var strTest = new List<string> { "B1", "B2", "B3", "B10" }; 
    strTest.Sort((s1, s2) => 
    { 
     string pattern = "([A-Za-z])([0-9]+)"; 
     string h1 = Regex.Match(s1, pattern).Groups[1].Value; 
     string h2 = Regex.Match(s2, pattern).Groups[1].Value; 
     if (h1 != h2) 
      return h1.CompareTo(h2); 
     string t1 = Regex.Match(s1, pattern).Groups[2].Value; 
     string t2 = Regex.Match(s2, pattern).Groups[2].Value; 
     return int.Parse(t1).CompareTo(int.Parse(t2)); 
    }); 
+2

很好的答案 - 如果有人需要將此應用於可能有或沒有數字和/或空格的字符串,只需修改該模式爲:'string pattern =「([A-Za-z \ \ S] *)([0-9] *)「;' – Gumzle

1

用空字符串替換B並將剩餘的字符串轉換爲數字。

var sort = strTest.OrderBy(x => Convert.ToInt32(x.Replace("B", ""))); 
+0

hi kabayan':'' –

+0

嗨kabayan @JW。謝謝你的回答 –

4
var sort = strTest.OrderBy(x => int.Parse(x.Replace("B",string.Empty))); 

輸出:B1,B2,B3,B10

1

,你可以嘗試這個

var strTest = new List<string> { "B2", "B1", "B10", "B3" }; 

    var res = strTest.OrderBy(x=> int.Parse(x.Split('B')[1])); 

,或者

var strTest = new List<string> { "B2", "B1", "B10", "B3" }; 
    var res = strTest.OrderBy(x=> int.Parse(x.Remove(0,1))); 
相關問題