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

我的字典:

Dictionary dic = new Dictionary(); 

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

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

Dictionary类是一个无序集合。 添加和删​​除项目可以更改被视为第一个和最后一个元素的内容。 因此无法添加Last元素。

有一个有序的字典类,以SortedDictionary的forms提供。 但是这将根据键的比较而不是添加值的顺序进行排序。

编辑

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

 var last = dictionary.Values.Last(); 

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

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

如果您正在寻找对项目进行排序的集合,请考虑使用SortedDictionary

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

 myDictionary.Values.OrderBy( x => x.Key ).Last(); 

通过警惕使用Dictionary.Keys.Last() – 虽然键列表使用默认IComparer对键的类型进行排序,但您获得的值可能不是您期望的值。

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

以下在.NET 4.0上对我不起作用:

 myDictionary.Values.OrderBy( x => x.Key ).Last(); 

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

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


 var lastDicVal = dic.Values.Last(); 

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


我的解决方案如下:

 var lastValue = dic[dic.Keys.Max()]; 

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

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

  dic.Keys.Last() 

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

 IDictionary dic = new SortedDictionary(); 

考虑在自定义集合的Add方法中创建包含引用的自定义集合。 这将根据您的要求设置包含最后添加的键/值(或两者)的私有字段。

然后有一个Last()方法返回它。 这是一个概念certificate类来certificate我的意思(请不要缺乏界面实现等 – 这是示例代码):

 public class LastDictionary { private Dictionary dict; public LastDictionary() { dict = new Dictionary(); } public void Add(TKey key, TValue value) { LastKey = key; LastValue = value; dict.Add(key, value); } public TKey LastKey { get; private set; } public TValue LastValue { get; private set; } } 

而不是使用:

 Dictionary 

……你可以用:

 List> 

这将允许您使用索引器按顺序而不是按键访问元素。

来自文档 :

出于枚举的目的,字典中的每个项都被视为表示值及其键的KeyValuePair结构。 返回项的顺序未定义

所以,我认为你不能依靠Dictionary来返回最后一个元素。

使用另一个集合。 也许SortedDictionary

如果你只想要这个值,这应该有用(假设你可以使用LINQ):

 dic.Values.Last() 

你可以使用:

 dic.Last() 

但是字典实际上没有最后一个元素(内部的对不是以任何特定的方式排序)。 最后一项将始终是相同的,但它可能是哪个元素并不明显。

使用.Net 3.5:

 string lastItem = dic.Values.Last() string lastKey = dic.Keys.Last() 

…但请记住,字典不是有序的,因此您不能指望值将保持相同的顺序。

字典不是按顺序访问的,所以首先,最后没有意义。 您想要由最高键索引的值吗?

 Dictionary dic = new Dictionary(); double highest = double.MinValue; string result = null; foreach(double d in dic.keys) { if(d > highest) { result = dic[d]; highest = d; } } 

您可以通过Count属性访问任何Collection对象的最后一个元素,而不是像其他大多数答案一样使用Linq(有关更多信息,请参阅ICollection.Count属性 )。

有关如何使用count访问任何Collection(包括Dictionary)中的final元素的示例,请参阅此处的代码:

 Dictionary dic = new Dictionary(); var lastElementIndex = dic.Count - 1; var lastElement = dic[lastElementIndex]; 

请记住,这会返回最后一个VALUE ,而不是键。