orderby()包含数字和字母

时间:2015-06-22 18:17:07

标签: c# wpf linq linq-to-sql sql-order-by

我想按升序排序包含数字和字母的数组 这些值作为字符串存储在DB中。

这是我的名单

4B
1A
1
1B
2
4C
4

并希望他们按照这样的顺序排序,其中数字按字母顺序升序,后跟字母。

1
1A
1B
2
4
4B
4C

到目前为止,我试过

 allScenes.OrderBy(x => Convert.ToInt32(x.SceneNumber)).ToList()

 allScenes.OrderBy(x => Convert.int.parse(x.SceneNumber)).ToList()

但由于号码后面的字母,两者都不起作用。 知道我怎么能做这个工作吗?

3 个答案:

答案 0 :(得分:6)

根据您的示例数据,第一个数字始终为一位数:

allScenes.OrderBy(x => x.SceneNumber).ToList()

如果您可以使用多位数字,请在排序顺序中提供它们以及您希望它们的位置。

这是对多位数字进行排序的一种方法:

var allScenes = new[]{
  new {SceneNumber="4B"},
  new {SceneNumber="1A"},
  new {SceneNumber="1"},
  new {SceneNumber="1B"},
  new {SceneNumber="2"},
  new {SceneNumber="14"},
  new {SceneNumber="4C"},
  new {SceneNumber="14A"},
  new {SceneNumber="200"},
  new {SceneNumber="200A"},
  new {SceneNumber="200B"}
  };
var nums="0123456789".ToCharArray();
var result=allScenes
  .OrderBy(x=>x.SceneNumber.LastIndexOfAny(nums))
  .ThenBy(x=>x.SceneNumber);

结果:

1 
1A 
1B 
2 
4B 
4C 
14 
14A 
200 
200A 
200B 

数据库可能无法将LastIndexOfAny函数转换为类似SQL的函数,因此您可能需要在.OrderBy()之前执行.ToList():

var nums="0123456789".ToCharArray();
var result=allScenes
  .ToList()
  .OrderBy(x=>x.SceneNumber.LastIndexOfAny(nums))
  .ThenBy(x=>x.SceneNumber);

答案 1 :(得分:0)

非常简单

string[] allScenes = {"4B","1A","1","1B","2","4C"};

var result = allScenes.OrderBy(x => x.First()).ThenBy(x => x.Last());

答案 2 :(得分:0)

当值作为string存储到数据库中时,您只需编写OrderBy(e=> e)即可。

以下代码证明了这一点:

string[] items = {"4B", "1A", "1", "1B", "2", "4C", "4"};
items.OrderBy(e=> e)