.NET / C# - 将列表转换为排序列表

Posted

技术标签:

【中文标题】.NET / C# - 将列表转换为排序列表【英文标题】:.NET / C# - Convert List to a SortedList 【发布时间】:2010-11-02 04:36:07 【问题描述】:

将 List 转换为 SortedList 的最佳方法是什么?有什么好方法可以在不循环的情况下做到这一点?使用 OrderBy() 有什么聪明的方法吗?

总结 请阅读所有答案和 cmets。

【问题讨论】:

SortedList 是一个关联集合,而不是一个简单的列表。你想设置什么作为键/值? 你的“最佳”标准是什么?最短的代码,最快的代码,最容易理解的代码,最容易调试的代码,最便携的代码?还有什么? 我想最容易理解。但是快速/干净/简单/简洁会很好 Mehrdad,好问题。我想我打算从我的对象中提取一个属性作为键。我认为 BFree 的例子让我走上了正确的道路。 【参考方案1】:

你的意思是:

    您有 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 但你去吧。

【讨论】:

相当晚了——如果我有(对或错,它是一个“游乐场”应用程序)我已经从“其他地方”检索了一个“列表”(更可能是 IEnumerable),我想在我的应用程序作为一个排序列表 - 在这一点上,人们想要做一个副本 - 虽然不是,正如你所指出的那样,条目作为自身的关键。 @Murph 很酷,您是否希望按排序顺序维护列表(在这种情况下,您需要第三方类,因为在 3.5 框架中不存在这样的类)还是您乐意复制, 排序,然后不再修改它(在这种情况下,您应该将其保留为 IEnumerable 或 IOrderedEnumerable)【参考方案2】:
var list = new List<string>();
var sortedList = new SortedList<string, string>(list.ToDictionary(s => s));

现在我不知道这有多高效,但它是一行代码:) 另外,在这个例子中,我只是使用字符串本身作为选择器。在实际场景中,您应该提前知道您希望将什么用作选择器。

【讨论】:

【参考方案3】:

了解List&lt;T&gt; 是智能数组,SortedList&lt;T, U&gt; 是键/值二叉树。由于它们的结构之间没有关系,因此不可能有比简单地从列表中取出每个元素并将其放入树中更有效的方法。

如果您的意思是“排序列表”而不是“SortedList”,那么通过List.Sort() 或适当的OrderBy() 对列表进行排序是很简单的。

【讨论】:

【参考方案4】:

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

我相信 LINQ 为您提供了一个 ISortedEnumerable,这对于您的目的可能已经足够了。

【讨论】:

以上是关于.NET / C# - 将列表转换为排序列表的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 json.net 将 c# 通用列表转换为 json?

如何将 C# 多维列表转换为 VB.Net

对对象列表进行排序并转换为对象列表

c#将连接项的列表排序为多个列表

C#:如何将对象列表转换为该对象的单个属性列表?

如何将字符串列表转换为c#中的浮点列表,统一?