Если вы не храните улицу-номер в отдельном поле, но вы ожидаете, что это будет в первой позиции, вы могли бы использовать этот класс с содержательными свойствами, чтобы извлечь всю информацию:
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();
Это одно поле, или вы храните номер улицы в отдельном поле? Кроме того, какой провайдер LINQ вы используете (Linq-To-Objects, Linq-To-SQL, Linq-To-Entities)? –
Это единственное поле, просто строка, содержащая весь адрес. Я просто использую/импортирую System.Linq – thegunner