我有一个asp下拉列表控件,数据绑定到sql数据库。它收到的值如下所示:
S1
S10
S10A
S10B
S10C
S1A
S1B
S1C
S1D
但是我需要先按alpha排序,然后按数字排序,但要包括最后一个字母(如果有的话)。所以输出应该如下所示:
S1
S1A
S1B
S1C
S1D
S10
S10A
S10B
S10C
我可以在select语句中执行ORDER BY,但这并不能解决问题。
答案 0 :(得分:1)
我没有调试并完全检查它,因此它可能包含一些错误, 但一般的想法是从集合中的字符串中获取所有三个排序参数:
第一个字母 - 字符串排序。
数字 - 数字排序。
最后一个字母 - 字符串排序。
然后创建一个包含所有三个对象的对象并进行相应的排序。
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();
希望它有所帮助。