.NET / C# - 将 List 转换为 SortedList

17

如何最好地将List转换为SortedList?是否有不必遍历它的好方法?使用OrderBy()是否有巧妙的方式来做到这一点?

总结:请阅读所有答案和评论。


2
SortedList是一种关联集合,而不是简单的列表。您想将什么设置为键/值? - Mehrdad Afshari
6
“最好”的标准是什么?是代码最短、执行最快、易于理解、易于调试、最具可移植性还是其他标准? - Eric Lippert
1
我想最容易理解的是简洁明了的。但是快速/干净/简单/简洁也是很好的选择。 - BuddyJoe
Mehrdad,好问题。我想我要从我的对象中提取一个属性作为键。BFree的例子让我觉得我走在了正确的道路上。 - BuddyJoe
4个回答

25
您是指:
1. 您有一个 `List` 并希望对其进行原地排序? 2. 您有一个 `List` 并希望创建另一个已经排序的“列表”? 3. 您有一个 `List` 并希望创建一个 `SortedList`,其中键和值相同?
假设输入为:
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]; }

我不明白为什么你要这样做,但是既然你想做,那就去吧。


有点晚了 - 我已经从“其他地方”检索到一个“列表”(更可能是IEnumerable),我想在我的应用程序中将其作为排序列表进行管理 - 此时需要进行复制 - 尽管不是像您指出的那样,以条目本身作为键。 - Murph
@Murph,你想要列表按照排序顺序进行维护吗(如果是这样,你需要一个第三方类,因为在3.5框架中没有这样的类),还是你愿意复制、排序,然后再也不修改它(如果是这样,你应该将其保留为IEnumerable或IOrderedEnumerable)。 - ShuggyCoUk
我想要做3件事情,以便在列表中通过特定字段在列表元素类型中高效地查找项目。 - M.M

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

现在我不知道这有多有效率,但这只是一行代码 :) 在这个例子中,我只是把字符串本身用作选择器。在实际情况中,你应该提前知道想要使用什么作为选择器。


3

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

LINQ提供了一个ISortedEnumerable,我认为这可能已经足够满足您的需求。

3
了解到 List<T> 是一个智能数组,而 SortedList<T, U> 是一个键/值二叉树。由于它们的结构之间没有关系,所以除了将列表中的每个元素放入树中,不可能有更有效的方法来完成此操作。
如果您指的是“有序列表”而不是“SortedList”,那么可以通过 List.Sort() 或适当的 OrderBy() 对列表进行排序,这很简单。

SortedList不是二叉树。请参见https://dev59.com/Bp7ls4cB2Jgan1znfS8b - Markus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接