订购地址列表

本文关键字:列表 地址 | 更新日期: 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.Splitint.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。