今天我刚尝试了LINQ-Framework,并想知道是否有办法做到以下几点。 我有一份地址列表,其中包含街道名称和房屋编号。首先,我根据街道名称列出所有地址
list = list.OrderBy(x => x.StreetName)
如果街道名称相同,我想使用ThenBy
- 表达式来比较房屋号码,但这是问题,因为房屋号码可能包含两部分:一个整数(例如12)和一个字符串 - 后缀(例如A)导致12A。所以我想对housenumber(int值)和后缀(字符串值)的列表进行排序。我还创建了正则表达式来将housenumber分成int和string值,所以这不是问题,这里是它:(\d+) *(\S)*
但是我没有得到这两个值(在某些情况下只有一个,因为没有后缀)也可以对LINQ进行排序。
我有办法做到这一点吗?
答案 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的解决方案可能会缩短,但显然没有......