2014-11-06 3 views
0

Я создал список, который содержит несколько адресов. Я хочу, чтобы отсортировать список, так что они будут появляется численно в порядке т.е.заказ списка адресов

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

Я попытался list.sort - что делает в алфавитном порядке, но поэтому 10 появляется перед 2.

Мой LINQ ограничен, так что я думал, что может быть способ использовать это или использовать регулярное выражение.

Любые идеи?

+0

Это одно поле, или вы храните номер улицы в отдельном поле? Кроме того, какой провайдер LINQ вы используете (Linq-To-Objects, Linq-To-SQL, Linq-To-Entities)? –

+0

Это единственное поле, просто строка, содержащая весь адрес. Я просто использую/импортирую System.Linq – thegunner

ответ

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

Попробуйте это: -

var sortedList = addr.OrderBy(x => x.ID).ToList(); 

Fiddle.

Если вы хотите отсортировать его методом сортировки, то вам нужно реализовать интерфейс 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.

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 фильтруют, поэтому «неверные» адреса пропускаются. Если это нежелательно, вы можете использовать:

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(); 
Смежные вопросы