编辑:感谢Jason,它是一本字典的事实并不那么重要。我只是希望运行时具有较低的运行时间。 LINQ方法快吗?另外,我知道这不是主题,但是n =>是什么意思?
我有一个数字列表,我想制作另一个列表,其中包含最开头和最少的数字。
所以我做的是通过列表并检查数字 x 是否在字典中。如果不是那么我将密钥 x 和值1。如果是,那么我将值更改为值加1。
现在我想订购字典,这样我就可以制作一个列表,其中包含开头最多但最后最少的列表。
我怎样才能在C#中做到这一点? PS。运行时非常重要。
答案 0 :(得分:11)
所以听起来你有Dictionary<int, int>
,其中键表示列表中的某个整数,相应的值表示整数出现次数的计数。您是说要按频率按降序排序的计数来订购密钥。然后你可以说
// dict is Dictionary<int, int>
var ordered = dict.Keys.OrderByDescending(k => dict[k]).ToList();
现在,听起来你开始使用List<int>
,这是你要计算的值和按计数排序。您可以在LINQ中快速完成此操作:
// list is IEnumerable<int> (e.g., List<int>)
var ordered = list.GroupBy(n => n)
.OrderByDescending(g => g.Count())
.Select(g => g.Key)
.ToList();
或查询语法
var ordered = (from n in list
group n by n into g
orderby g.Count() descending
select g.Key).ToList();
现在,如果你需要中间词典,你可以说
var dict = list.GroupBy(n => n)
.ToDictionary(g => g.Key, g => g.Count());
var ordered = dict.Keys.OrderByDescending(k => dict[k]).ToList();
答案 1 :(得分:4)
以下信息提供:http://www.dotnetperls.com/sort-dictionary
Dictionary没有Sort方法。如果我们需要循环通过 字典内容按排序顺序,我们必须分别获取 元素并对它们进行排序这是通过键和值完成的 属性和List实例。
排序键
此示例通过使用Keys上的Keys属性解决了该问题 字典实例,然后是ToList扩展方法和Sort 实例方法。
首先,创建一个示例Dictionary,并使用Add填充 方法;接下来,在Keys上使用ToList和Sort方法; 最后,使用foreach-loop循环生成的List 构造。另外,请注意var隐式类型关键字是如何实现的 在整个过程中使用,以减少语法冗余。
在Dictionary [C#]
中对键进行排序的程序using System; using System.Collections.Generic; using System.Linq; class Program { static void Main() { // Create dictionary and add five keys and values. var dictionary = new Dictionary<string, int>(); dictionary.Add("car", 2); dictionary.Add("apple", 1); dictionary.Add("zebra", 0); dictionary.Add("mouse", 5); dictionary.Add("year", 3); // Acquire keys and sort them. var list = dictionary.Keys.ToList(); list.Sort(); // Loop through keys. foreach (var key in list) { Console.WriteLine("{0}: {1}", key, dictionary[key]); } } }
输出
apple: 1 car: 2 mouse: 5 year: 3 zebra: 0
排序值
接下来,我们将展示如何对Dictionary中的值进行排序。我们看到一个控制台 程序,你可以在Visual Studio中编译并运行。它增加了一个键 字典然后按它们的值对它们进行排序。记住这一点 字典实例最初不以任何方式排序。我们用的是 查询语句中的LINQ orderby关键字。
对Dictionary [C#]
进行排序的OrderBy子句程序using System; using System.Collections.Generic; using System.Linq; class Program { static void Main() { // Example dictionary. var dictionary = new Dictionary<string, int>(5); dictionary.Add("cat", 1); dictionary.Add("dog", 0); dictionary.Add("mouse", 5); dictionary.Add("eel", 3); dictionary.Add("programmer", 2); // Order by values. // ... Use LINQ to specify sorting by value. var items = from pair in dictionary orderby pair.Value ascending select pair; // Display results. foreach (KeyValuePair<string, int> pair in items) { Console.WriteLine("{0}: {1}", pair.Key, pair.Value); } // Reverse sort. // ... Can be looped over in the same way as above. items = from pair in dictionary orderby pair.Value descending select pair; } }
输出
dog: 0 cat: 1 programmer: 2 eel: 3 mouse: 5
降序关键字
降序排序
var items = from pair in dictionary orderby pair.Value descending select pair;
示例输出
mouse: 5 eel: 3 programmer: 2 cat: 1 dog: 0
答案 2 :(得分:1)
使用IEnumerable()上的GroupBy扩展名对数字进行分组并提取每个数字的计数。这将从列表中创建字典并在一个语句中对其进行排序。
var ordered = list.GroupBy( l => l )
.OrderByDescending( g => g.Count() )
.ToDictionary( g => g.Key, g.Count() );
答案 3 :(得分:0)
List<KeyValuePair<type, type>> listEquivalent =
new List<KeyValuePair<type, type>>(dictionary);
listEquivalent.Sort((first,second) =>
{
return first.Value.CompareTo(second.Value);
});
这样的事可能吗?
编辑:感谢杰森关于我遗漏的通知
答案 4 :(得分:0)
您也可以考虑使用SortedDictionary。
在插入时,它根据键对项目进行排序。 more..