Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

.NET / C# - Convert List to a SortedList

What is the best way to convert a List to SortedList? Any good way to do it without cycling through it? Any clever way to do it with an OrderBy()?

WRAP UP Please read all answers and comments.

like image 702
BuddyJoe Avatar asked Jun 11 '09 15:06

BuddyJoe


4 Answers

Do you mean:

  1. you have a List<T> and wish it to be sorted in place?
  2. you have a List<T> and wish to create another 'list' which is itself sorted
  3. you have a List<T> and wish to make a SortedList<T,T> where the key is the same as the value

Assuming input:

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

1 is trivial

x.Sort();

2 is trivial

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

3 is trivial with a copy

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

and more efficiently:

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

I can't see why you would want to do 3 but there you go.

like image 103
ShuggyCoUk Avatar answered Sep 21 '22 13:09

ShuggyCoUk


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

Now I have no clue how efficient this is, but it's one line of code :) Also, in this example I just used the string itself as the selector. In a real scenario, you should know ahead of time what you'd like to use as a selector.

like image 23
BFree Avatar answered Sep 24 '22 13:09

BFree


Understand that a List<T> is a smart array, and a SortedList<T, U> is a key/value binary tree. Since there's no relationship between their structures, there can't possibly be a more effective way to do it rather than simply taking each element from the list and putting it into the tree.

If you mean "sorted list" instead of "SortedList," then it's trivial to sort your list via either List.Sort() or an appropriate OrderBy().

like image 30
mqp Avatar answered Sep 22 '22 13:09

mqp


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

The LINQ gives you an ISortedEnumerable i believe, which may be good enough for your purposes.

like image 25
Will Eddins Avatar answered Sep 22 '22 13:09

Will Eddins