如何从 Dictionary<string, int> 中检索前 n 个元素?

11

在 C# 中,有没有一种方法可以从字典中检索前 n 个元素?

5个回答

17

字典本身并没有排序,"第一个"并不一定意味着它是第一个。MSDN上说:"对于枚举...返回的项目顺序是未定义的。"

根据你的平台版本,你可以使用OrderedDictionary,这不是一个特别复杂的事情,只需要创建一个Dictionary的自定义子类即可。


14

往往省略字典转换会导致无法正常工作:

dictionary = dictionary.Take(n);

而一个简单的案例也不会改变这个事实:

dictionary = dictionary.Take(n).ToDictionary();

最保险的方法是使用显式转换:

dictionary = dictionary.Take(n).ToDictionary(kvp => kvp.Key, kvp => kvp.Value);

3
这可能是最好的答案,需要投票支持。 - jerrythomas38
同意并点赞 - endurium

12

请注意,Dictionary 没有明确的排序方式,因此虽然以下代码将返回 n 个项目,但无法保证框架将如何确定返回哪些 n 个项目。

using System.Linq;

yourDictionary.Take(n);

以上代码返回一个包含n个项的IEnumerable<KeyValuePair<TKey,TValue>>。您可以轻松地将其转换为一个Dictionary<TKey,TValue>,如下所示:

yourDictionary.Take(n).ToDictionary();

在使用以上方法后,我遇到了以下错误 - 错误38:无法隐式将类型'System.Collections.Generic.IEnumerable<System.Collections.Generic.KeyValuePair<string, int>>'转换为类型'System.Collections.Generic.Dictionary<string, int> '。存在显式转换(是否缺少强制转换?) E:\Assignments\Hotel search web application\Tavisca.Budgie\Tavisca.Budgie.Ui\Models\UserDataAccess.cs 1149 24 Tavisca.Budgie.Ui - buntykawale
看起来你正在尝试将元素放入一个新的字典中。你需要使用Enumerable.ToDictionary()方法来完成这个任务。 - Daniel Brückner
@buntykawale,正如Daniel所提到的,Take方法返回的是IEnumerable而不是Dictionary。我已经更新了我的答案,展示了如何转换回Dictionary。 - LukeH
下面是 @Chris Schiffhauer 的关键代码,从字典中取出前 n 个元素并转换成新的字典:dictionary.Take(n).ToDictionary(kvp => kvp.Key, kvp => kvp.Value); - jerrythomas38

6

你无法从Dictionary<TKey,TValue>中取出前N个元素,因为它不是一个有序的集合。所以它实际上没有First、Last等概念...但正如其他人指出的那样,如果你只想取出N个元素而不考虑顺序,LINQ的Take函数就可以很好地工作。

var map = GetTheDictionary();
var firstFive = map.Take(5);

3

可以举个Linq的例子吗?

 var dictionary = new Dictionary<string, int>();

 /// Add items to dictionary

 foreach(var item in dictionary.Take(5))
 {
      // Do something with the first 5 pairs in the dictionary
 }

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