订购地址列表
本文关键字:列表 地址 | 更新日期: 2023-09-27 18:29:34
我创建了一个列表,其中包含许多地址。我想对列表进行排序,使其按数字顺序显示,即
1 Abbey Road
2 Abbey Road
3 Abbey Road
10 Abbey Road
我试过list.sort,它按字母顺序排列,但因此10出现在2之前。
我的linq是有限的,所以我想可能有一种方法可以使用它或使用正则表达式。
有什么想法吗?
您可以使用Linq的OrderBy
(http://msdn.microsoft.com/en-us/library/vstudio/bb549422%28v=vs.110%29.aspx)排序:
list.OrderBy(street => street, comparer);
其中street
是具有街道名称的字符串,comparer
是按照您想要的方式对其进行排序的IComparer
。要对字符串进行数字排序,您可以查看以下内容:对字符串列表进行数字排序(1,2,…,9,10而不是1,10,2)
如果您不将街道编号存储在单独的字段中,但希望它位于第一个位置,则可以使用具有有意义属性的此类来提取所有信息:
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();
试试这个:-
var sortedList = addr.OrderBy(x => x.ID).ToList();
Fiddle。
如果您希望通过sort方法对其进行排序,那么您需要实现IComparable接口:-
public class Address : IComparable<Address>
{
public int ID { get; set; }
public string Add { get; set; }
public int CompareTo(Address other)
{
return this.ID.CompareTo(other.ID);
}
}
然后你可以做:-
addr.Sort();
SortFiddle。