按字母,数字和字符串字段排序对象列表?

时间:2019-09-06 02:02:16

标签: c# .net linq

用字母数字字符串列表对对象进行排序的好方法是什么?

我有一个这样的对象列表。

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个字符,全为字母数字,无特殊字符。

1 个答案:

答案 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