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集合中的最后一个值.这可能是您添加到词典中的最后一个值,也可能不是.它可能不像它那样可能.
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
的类型的默认值进行排序,但您获得的值可能不是您期望的值.
我知道这个问题太老了,无法得到任何赞成,但我不喜欢任何答案,所以会发布我自己的希望为未来的读者提供另一种选择.
下面并没有对我的.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)加上任何开销存在于跟踪最后插入的条目.
如果您使用的是.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)