Подтвердить что ты не робот

Сортировка списка по алфавиту

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

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. Я только что услышал предложение, которое я мог бы использовать.

4b9b3361

Ответ 1

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

list.Sort();

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

EDIT: обратите внимание, что в вашем коде вам понадобится

_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

Существуют другие реализации перетасовки с Fisher-Yates on Qaru - поиск, и вы найдете его довольно быстро.

Ответ 2

Существует два способа:

Без LINQ: yourList.Sort();

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

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

Ответ 3

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

_details.Sort((s1, s2) => s1.CompareTo(s2)); 

Ответ 4

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

var sortedItems = myList.OrderBy(s => s);