获取字典中的最后一个元素?

sub*_*ime 22 .net c# dictionary

我的字典:

Dictionary<double, string> dic = new Dictionary<double, string>();
Run Code Online (Sandbox Code Playgroud)

如何返回字典中的最后一个元素?

Jar*_*Par 51

你最后的意思是什么?你的意思是最后增值吗?

Dictionary<TKey,TValue>班是一个无序的集合.添加和删​​除项目可以更改被认为是第一个和最后一个元素的内容.因此无法添加Last元素.

有一个有序的字典类以形式提供SortedDictionary<TKey,TValue>.但是这将基于键的比较而不是添加值的顺序来排序.

编辑

有几个人提到过使用以下LINQ风格的方法

var last = dictionary.Values.Last();
Run Code Online (Sandbox Code Playgroud)

对使用这种方法要非常谨慎.它将返回Values集合中的最后一个值.这可能是您添加到词典中的最后一个值,也可能不是.它可能不像它那样可能.

  • 虽然没有通用版本,但System.Collection.Specialized命名空间中有一个OrderedDictionary,它按插入顺序维护项目. (6认同)
  • 支持不使用LINQ样式方法的警告,因为它不会返回次贷要求。 (2认同)

LBu*_*kin 21

字典是无序集合 - 因此,没有第一个或最后一个元素的概念.如果您正在寻找一个行为类似于字典但保持项目的插入顺序的类,请考虑使用OrderedDictionary.

如果您正在寻找对物品进行分类的集合,请考虑使用SortedDictionary<TKey,TValue>.

如果你有一个现有的字典,并且你正在寻找给定排序顺序的'last'元素,你可以使用linq对集合进行排序,例如:

myDictionary.Values.OrderBy( x => x.Key ).Last();
Run Code Online (Sandbox Code Playgroud)

谨慎使用Dictionary.Keys.Last()- 虽然键列表使用键IComparer的类型的默认值进行排序,但您获得的值可能不是您期望的值.


Cha*_*rns 7

我知道这个问题太老了,无法得到任何赞成,但我不喜欢任何答案,所以会发布我自己的希望为未来的读者提供另一种选择.

下面并没有对我的.NET 4.0的工作:

myDictionary.Values.OrderBy( x => x.Key ).Last();
Run Code Online (Sandbox Code Playgroud)

我怀疑问题是'x'表示字典中的值,并且值没有键(字典存储键,字典值不存在).我也可能在使用该技术时犯了一个错误.

无论哪种方式,这个解决方案对于大型词典来说都会很慢,对于CS人来说可能是O(n log n),因为它只是为了获得一个条目而对整个字典进行排序.这就像重新排列整个DVD集合,只是为了找到一部特定的电影.


var lastDicVal = dic.Values.Last();
Run Code Online (Sandbox Code Playgroud)

是一个坏主意.实际上,由于Microsoft实施了字典,这个解决方案实际上大部分时间都可以正常工作,但在软件工程术语中,这些术语毫无意义且不应该依赖.即使它在永恒的其余部分每次都有效,它也代表了一种草率,不安全的编码实践.


我的解决方案如下:

var lastValue = dic[dic.Keys.Max()];
Run Code Online (Sandbox Code Playgroud)

Keys.max()函数比排序O(n)而不是O(n log n)快得多.如果性能足够重要,即使O(n)太慢,也可以在用于替换dic.Keys.Max()的单独变量中跟踪最后插入的密钥,这将使整个查找O(1)加上任何开销存在于跟踪最后插入的条目.


Chr*_*ett 5

如果您使用的是.NET 3.5,请查看:

 dic.Keys.Last()
Run Code Online (Sandbox Code Playgroud)

但是,如果您想要可预测的订单,请使用:

IDictionary<int, string> dic = new SortedDictionary<int, string>();
Run Code Online (Sandbox Code Playgroud)