如何在C#中订购字典?

时间:2010-01-17 13:49:28

标签: c# dictionary

  

编辑:感谢Jason,它是一本字典的事实并不那么重要。我只是希望运行时具有较低的运行时间。 LINQ方法快吗?另外,我知道这不是主题,但是n =>是什么意思?

我有一个数字列表,我想制作另一个列表,其中包含最开头和最少的数字。

所以我做的是通过列表并检查数字 x 是否在字典中。如果不是那么我将密钥 x 和值1。如果是,那么我将值更改为值加1。

现在我想订购字典,这样我就可以制作一个列表,其中包含开头最多但最后最少的列表。

我怎样才能在C#中做到这一点? PS。运行时非常重要。

5 个答案:

答案 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..