.NET/С# - преобразовать список в отсортированный список

Каков наилучший способ преобразования списка в SortedList? Любой хороший способ сделать это, не проезжая через него? Любой умный способ сделать это с помощью OrderBy()?

WRAP UP Пожалуйста, прочитайте все ответы и комментарии.

Ответ 1

var list = new List<string>();
var sortedList = new SortedList<string, string>(list.ToDictionary(s => s));

Теперь я не знаю, насколько это эффективно, но это одна строка кода:) Кроме того, в этом примере я просто использовал строку как селектор. В реальном сценарии вы должны заранее знать, что вы хотели бы использовать в качестве селектора.

Ответ 2

Вы имеете в виду:

  • У вас есть List<T> и хотите, чтобы он был отсортирован на месте?
  • у вас есть List<T> и вы хотите создать другой "список", который сам сортируется
  • у вас есть List<T> и вы хотите сделать SortedList<T,T>, где ключ совпадает с значением

Предполагая ввод:

var x = new List<int>() { 3, 2, 1 };    

1 тривиально

x.Sort();

2 тривиально

// sx is an IOrderedEnumerable<T>, you can call ToList() on it if you want
var sx = x.OrderBy(i => i); 

3 тривиально с копией

var s = new SortedList<int,int>(t.ToDictionary(i => i));

и более эффективно:

var s = new SortedList<int,int>();
foreach (var i in x) { s[i] = [i]; }

Я не понимаю, почему вы хотели бы сделать 3, но там вы идете.

Ответ 3

Поймите, что List<T> - это интеллектуальный массив, а SortedList<T, U> - двоичное дерево ключа/значения. Поскольку между их структурами нет никакой связи, не может быть более эффективного способа сделать это, а не просто взять каждый элемент из списка и поместить его в дерево.

Если вы имеете в виду "отсортированный список" вместо "SortedList", тогда тривиально сортировать свой список через List.Sort() или соответствующий OrderBy().

Ответ 4

List unsortedPersons = new List();
// ... Populate unsortedPersons ...
var sorted = from person in unsortedPersons
             orderby person.Name
             select person;

LINQ дает вам ISortedEnumerable, я считаю, что может быть достаточно хорошим для ваших целей.