Сортировать список по алфавиту - PullRequest
68 голосов
/ 06 августа 2011

У меня есть следующий класс:

class Detail
{
    public Detail()
    {
        _details = new List<string>();
    }
    public IList<string> Details { get { return _details; } }
    private readonly List<string> _details;
}

В настоящее время я сортирую класс случайным образом, используя следующее:

void ShuffleGenericList<T>(IList<T> list)
{
    //generate a Random instance
    var rnd = new Random();
    //get the count of items in the list
    var i = list.Count();
    //do we have a reference type or a value type
    T val = default(T);

    //we will loop through the list backwards
    while (i >= 1)
    {
        //decrement our counter
        i--;
        //grab the next random item from the list
        var nextIndex = rnd.Next(i, list.Count());
        val = list[nextIndex];
        //start swapping values
        list[nextIndex] = list[i];
        list[i] = val;
    }
}

Я бы хотел отсортировать содержимое деталей в алфавитном порядке.

Например, если содержимое выглядит следующим образом:

[0] a
[1] d
[2] b

Я хочу иметь возможность запустить этот метод и отсортировать его по:

[0] a
[1] b
[2] d

Кто-нибудь знает простой способ сделать это? Обратите внимание, что списки обычно содержат менее десяти записей. Могу ли я сделать это с помощью LINQ? Извините, но я не очень знаком с LINQ. Я только что услышал предположение, что могу это использовать.

Ответы [ 5 ]

133 голосов
/ 06 августа 2011

Вы можете отсортировать список на месте , просто позвонив по телефону List<T>.Sort:

list.Sort();

Это будет использовать естественное упорядочение элементов, что хорошо в вашем случае.

РЕДАКТИРОВАТЬ: обратите внимание, что в вашем коде вам потребуется

_details.Sort();

как метод Sort определяется только в List<T>, а не IList<T>. Если вам нужно отсортировать его извне, где у вас нет доступа к нему, как List<T> (вам не следует приводить его, поскольку часть List<T> является подробностью реализации), вам нужно сделать немного больше работа.

Я не знаю каких-либо IList<T> сортировок на месте в .NET, что немного странно, если подумать. IList<T> предоставляет все, что вам нужно, поэтому можно записать как метод расширения. Существует множество реализаций быстрой сортировки, если вы хотите использовать одну из них.

Если вас не волнует неэффективность, вы всегда можете использовать:

public void Sort<T>(IList<T> list)
{
    List<T> tmp = new List<T>(list);
    tmp.Sort();
    for (int i = 0; i < tmp.Count; i++)
    {
        list[i] = tmp[i];
    }
}

Другими словами, копируйте, сортируйте на месте, затем копируйте отсортированный список обратно.


Вы можете использовать LINQ для создания нового списка, который содержит исходные значения, но отсортирован:

var sortedList = list.OrderBy(x => x).ToList();

Это зависит от того, какое поведение вы хотите. Обратите внимание, что ваш метод случайного выбора не совсем идеален:

  • Создание нового Random в методе сталкивается с некоторыми проблемами , показанными здесь
  • Вы можете объявить val внутри цикла - вы не используете это значение по умолчанию
  • Более логично использовать свойство Count, когда вы знаете, вы работаете с IList<T>
  • На мой взгляд, цикл for проще понять, чем обход списка в обратном направлении с помощью цикла while

Существуют и другие реализации тасования с Фишером-Йейтсом при переполнении стека - ищите, и вы найдете его довольно быстро.

21 голосов
/ 06 августа 2011

Есть два способа:

Без LINQ: yourList.Sort();

С LINQ: yourList.OrderBy(x => x).ToList()

Вы найдете больше информации в: http://www.dotnetperls.com/sort-string-array

16 голосов
/ 06 августа 2011

Другой способ

_details.Sort((s1, s2) => s1.CompareTo(s2)); 
11 голосов
/ 06 августа 2011

Вы должны иметь возможность использовать OrderBy в LINQ ...

var sortedItems = myList.OrderBy(s => s);
1 голос
/ 06 августа 2011

Что не так с List<T>.Sort()?

http://msdn.microsoft.com/en-us/library/3da4abas.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...