使用LINQ排序列表

时间:2013-11-19 08:57:11

标签: c# linq sorting

今天我刚尝试了LINQ-Framework,并想知道是否有办法做到以下几点。 我有一份地址列表,其中包含街道名称和房屋编号。首先,我根据街道名称列出所有地址

list = list.OrderBy(x => x.StreetName)

如果街道名称相同,我想使用ThenBy - 表达式来比较房屋号码,但这是问题,因为房屋号码可能包含两部分:一个整数(例如12)和一个字符串 - 后缀(例如A)导致12A。所以我想对housenumber(int值)和后缀(字符串值)的列表进行排序。我还创建了正则表达式来将housenumber分成int和string值,所以这不是问题,这里是它:(\d+) *(\S)*但是我没有得到这两个值(在某些情况下只有一个,因为没有后缀)也可以对LINQ进行排序。

我有办法做到这一点吗?

2 个答案:

答案 0 :(得分:7)

更好的方法是让您的类实现IComparable接口。然后你可以打电话给排序,你就完成了。

// something like this
class Address  : IComparable<Address>
{
    public int Housenumber { get; set; }
    public string HousenumberExtra { get; set; }

    public int CompareTo(Address other)
    {
        var compareResult = Housenumber.CompareTo(other.Housenumber);

        if (compareResult == 0)
            return HousenumberExtra.CompareTo(other.HousenumberExtra);

        return compareResult;
    }
}

如果你真的想使用linq,你可以这样做(多个ThenBy)

var result = addresses
    .OrderBy(i => i.Streetname)
    .ThenBy(h => h.Housenumber)
    .ThenBy(he=> he.HousenumberExtra);

答案 1 :(得分:0)

我目前的方法如下所示,这可以满足我的需求,但可能不是最好的:

buildings.Sort(delegate(Adress g1, Adress g2)
{
    int compare = String.Compare(g1.StreetName, g2.StreetName);
    if (compare == 1 || compare == -1) return compare;

    else {
        // ...
        // split the housenumber into int and string part using a regex
        // ...
        if h1 < h2 return -1;  // h1 and h2 are the numbers
        else if h1 > h2 return 1;
        else return String.Compare(suffix1, suffix2); 

    };
});

希望LINQ的解决方案可能会缩短,但显然没有......