用字母数字字符串列表对对象进行排序的好方法是什么?
我有一个这样的对象列表。
public class ObjectA
{
public string A {get; set;}
}
var listOfItems = new List<ObjectA>()
{
new ObjectA() { A = "0000003F" },
new ObjectA() { A = "00000035" },
new ObjectA() { A = "TESTTEST" },
new ObjectA() { A = "000633BX" }
};
以及当我使用LINQ对这些进行排序时:
var sortedList = listOfItems.OrderBy(x => x.A);
我得到以下列表:
00000035
0000003F
D0000033
12345678
0A000033
000633BX
TESTTEST
但是要这样:
D0000033
TESTTEST
0A000033
0000003F
00000035
000633BX
12345678
我如何使排序按字母然后按数字进行?
字符串的固定长度为8个字符,全为字母数字,无特殊字符。
答案 0 :(得分:2)
您的订购算法尚不清楚,但是您可以采用以下方法。首先,定义一个自定义比较器:
public class ObjectAComparer : IComparer<ObjectA>
{
public int Compare(ObjectA x, ObjectA y)
{
// Quite possibly not the ordering logic you want. Change as needed.
// "IsNumber" means what you seem to have defined as numbers.
bool xIsNumber = x.A.Any(c => char.IsNumber(c));
bool yIsNumber = y.A.Any(c => char.IsNumber(c));
bool sameKind = !(xIsNumber ^ yIsNumber);
if (sameKind) return x.A.CompareTo(y.A); // Both numbers or both not numbers
if (xIsNumber) return 1;
return -1;
}
}
然后,您可以使用带有比较器的overload of OrderBy:
var sortedList = listOfItems.OrderBy(x => x, new ObjectAComparer());
输出:
TESTTEST
00000035
0000003F
000633BX