我创建了一个包含许多地址的列表。我想对列表进行排序,以便按顺序在数字上显示,即
1 Abbey Road
2 Abbey Road
3 Abbey Road
10 Abbey Road
我尝试过list.sort - 按字母顺序排列,但因此在2之前出现。
我的linq有限,所以我在想可能有办法使用或使用正则表达式。
有什么想法吗?
答案 0 :(得分:2)
试试这个: -
var sortedList = addr.OrderBy(x => x.ID).ToList();
如果您希望通过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();
答案 1 :(得分:1)
您可以使用Linq的OrderBy
(http://msdn.microsoft.com/en-us/library/vstudio/bb549422%28v=vs.110%29.aspx)排序:
list.OrderBy(street => street, comparer);
其中street
是包含街道名称的字符串,而comparer
是IComparer
,可按您希望的方式对其进行排序。要以数字方式对字符串进行排序,您可以在此处查看:
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.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
过滤器,因此&#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();