订购地址列表

时间:2014-11-06 11:49:13

标签: c# asp.net linq

我创建了一个包含许多地址的列表。我想对列表进行排序,以便按顺序在数字上显示,即

1 Abbey Road 
2 Abbey Road
3 Abbey Road
10 Abbey Road

我尝试过list.sort - 按字母顺序排列,但因此在2之前出现。

我的linq有限,所以我在想可能有办法使用或使用正则表达式。

有什么想法吗?

3 个答案:

答案 0 :(得分:2)

试试这个: -

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

答案 1 :(得分:1)

您可以使用Linq的OrderByhttp://msdn.microsoft.com/en-us/library/vstudio/bb549422%28v=vs.110%29.aspx)排序:

list.OrderBy(street => street, comparer);

其中street是包含街道名称的字符串,而comparerIComparer,可按您希望的方式对其进行排序。要以数字方式对字符串进行排序,您可以在此处查看: Sorting a List of Strings numerically (1,2,...,9,10 instead of 1,10,2)

答案 2 :(得分:0)

如果您不将街道号码存储在单独的字段中,但您希望它位于第一个位置,则可以使用此类具有有意义的属性来提取所有信息:

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过滤器,因此&#34;无效&#34;地址被跳过。如果不希望您使用:

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();