如果您不将街道号码存储在单独的字段中,但您希望它位于第一个位置,则可以使用具有有意义属性的此类来提取所有信息:
public class Address
{
public string FullAddress { get; set; }
public int Number { get; set; }
public string Street { get; set; }
}
现在基本上你只需要使用String.Split和int.Parse,例如在这个LINQ查询中:
List<Address> addresses = strings.Select(s => new {
FullAddress = s.Trim(),
Tokens = s.Trim().Split()
})
.Where(x => x.Tokens.Length > 1 && x.Tokens[0].All(Char.IsDigit))
.Select(x => new Address {
FullAddress = x.FullAddress,
Street = String.Join(" ", x.Tokens.Skip(1)),
Number = int.Parse(x.Tokens[0])
})
.OrderBy(addr => addr.Number)
.ToList();
如果您不想选择此类,而只想选择正确顺序的字符串,则必须将查询的结尾更改为:
.OrderBy(addr => addr.Number)
.Select(addr => addr.FullAddress)
.ToList();
注意Where 过滤器,因此“无效”地址被跳过。如果不需要,您可以使用:
int number;
List<Address> addresses = strings.Select(s => new {
FullAddress = s.Trim(),
Tokens = s.Trim().Split()
})
.Select(x => new Address{
FullAddress = x.FullAddress,
Street = String.Join(" ", x.Tokens.Skip(1)),
Number = int.TryParse(x.Tokens[0], out number) ? number : int.MaxValue
})
.OrderBy(addr => addr.Number)
.ToList();