按字母数字顺序排序下拉列表

时间:2015-02-02 13:08:22

标签: c# asp.net sql-server sorting natural-sort

我有一个asp下拉列表控件,数据绑定到sql数据库。它收到的值如下所示:

S1
S10
S10A
S10B
S10C
S1A
S1B
S1C
S1D

但是我需要先按alpha排序,然后按数字排序,但要包括最后一个字母(如果有的话)。所以输出应该如下所示:

S1
S1A
S1B
S1C
S1D
S10
S10A
S10B
S10C

我可以在select语句中执行ORDER BY,但这并不能解决问题。

1 个答案:

答案 0 :(得分:1)

我没有调试并完全检查它,因此它可能包含一些错误, 但一般的想法是从集合中的字符串中获取所有三个排序参数:

  1. 第一个字母 - 字符串排序。

  2. 数字 - 数字排序。

  3. 最后一个字母 - 字符串排序。

  4. 然后创建一个包含所有三个对象的对象并进行相应的排序。

        var items = new List<string> { "S1", "S10", "S10A", "S10B", "S10C", "S1A", "S1B", "S1C", "S1D" };
    
        var result = items.
            Select(o =>
            {
                var firstLetter = o[0];
    
                int lastLetterNumber;
                var lastChar = o[o.Length - 1].ToString();
                var lastLetterForSort = Int32.TryParse(lastChar, out lastLetterNumber) ? string.Empty : lastChar;
    
                var number = o.Substring(1,  lastLetterForSort.Equals(string.Empty) ? o.Length - 1 : o.Length - 2);
    
                return new { 
                    FirstLetter = firstLetter  , 
                    Number = Int32.Parse( number) , 
                    LastLetter = lastLetterForSort , 
                    Value = o
                };
            }).
            OrderBy(o => o.FirstLetter).
            ThenBy(o => o.Number).
            ThenBy(o => o.LastLetter).
            Select(o => o.Value).
            ToList();
    
    希望它有所帮助。