获取字典中的最后一个元素?
我的字典:
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 ,而不是键。
- 除了创建帮助器之外,创建静态方法的理想情况(实际示例)是什么?
- 如何将扩展的ascii转换为System.String?
- 如何在通用应用程序中禁用任务并行库的ETW事件源?
- 我可以在DLL中嵌入其他文件吗?
- System.Threading.Timer vs System.Threading.Thread.Sleep resolution – .NET Timer不使用系统时钟分辨率
- C#检测AnonymousType new {name = value,}并转换为Dictionary
- 为什么不能克隆IEnumerator?
- 如何隐藏自定义ComboBox中的Items属性
- 6位int的正则表达式,不能是连续的或重复的数字?