2013-06-24 117 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))); 
相关问题