我的字典:
Dictionary<double, string> dic = new Dictionary<double, string>();
如何返回字典中的最后一个元素?
答案 0 :(得分:47)
你到底是什么意思?你的意思是最后增值吗?
Dictionary<TKey,TValue>
类是无序集合。添加和删除项目可以更改被认为是第一个和最后一个元素的内容。因此无法添加Last元素。
有SortedDictionary<TKey,TValue>
形式的有序字典类。但是这将根据键的比较而不是添加值的顺序进行排序。
编辑
有些人提到使用以下LINQ样式方法
var last = dictionary.Values.Last();
对使用此方法非常谨慎。它将返回Values集合中的最后一个值。这可能是您添加到词典中的最后一个值,也可能不是。它可能不像它那样可能。
答案 1 :(得分:20)
字典是无序集合 - 因此,没有第一个或最后一个元素的概念。如果您正在寻找一个行为类似字典但保持项目的插入顺序的类,请考虑使用OrderedDictionary
。
如果您要查找对项目进行排序的集合,请考虑使用SortedDictionary<TKey,TValue>
。
如果你有一个现有的字典,并且你正在寻找给定某种排序顺序的'last'元素,你可以使用linq对集合进行排序,例如:
myDictionary.Values.OrderBy( x => x.Key ).Last();
警惕使用Dictionary.Keys.Last()
- 虽然键列表使用默认IComparer
对键的类型进行排序,但您得到的值可能不是您期望的值。
答案 2 :(得分:7)
我知道这个问题太老了,无法得到任何赞成,但我不喜欢任何答案,所以我会发布自己的希望为未来的读者提供另一种选择。
以下在.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)加上跟踪最后插入的条目的任何开销。
答案 3 :(得分:5)
如果您使用的是.NET 3.5,请查看:
dic.Keys.Last()
如果您想要可预测的订单,请使用:
IDictionary<int, string> dic = new SortedDictionary<int, string>();
答案 4 :(得分:3)
考虑创建一个自定义集合,其中包含自定义集合的Add
方法中的引用。这将根据您的要求设置包含最后添加的键/值(或两者)的私有字段。
然后使用Last()
方法返回此信息。这是一个概念证明类来证明我的意思(请不要忽略界面实现的缺点等等 - 这是示例代码):
public class LastDictionary<TKey, TValue>
{
private Dictionary<TKey, TValue> dict;
public LastDictionary()
{
dict = new Dictionary<TKey, TValue>();
}
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;
}
}
答案 5 :(得分:3)
而不是使用:
Dictionary<double, string>
......你可以使用:
List<KeyValuePair<double, string>>
这将允许您使用索引器按顺序而不是按键访问元素。
答案 6 :(得分:1)
来自docs:
为了枚举,每个项目 在字典中被视为一个 KeyValuePair结构代表一个 价值及其关键。 其中的顺序 返回的项目未定义。
所以,我认为你不能依靠Dictionary
来返回最后一个元素。
使用其他收藏品。也许SortedDictionary
...
答案 7 :(得分:0)
如果你只想要这个值,这应该有用(假设你可以使用LINQ):
dic.Values.Last()
答案 8 :(得分:0)
您可以使用:
dic.Last()
但字典实际上没有最后一个元素(内部对不以任何特定方式排序)。最后一项将始终相同,但它可能是哪个元素并不明显。
答案 9 :(得分:0)
使用.Net 3.5:
string lastItem = dic.Values.Last()
string lastKey = dic.Keys.Last()
...但请记住,字典不是有序的,因此您不能指望这些值保持相同的顺序。
答案 10 :(得分:0)
字典不是按顺序访问的,所以首先,最后没有意义。你想要用最高键索引的值吗?
Dictionary<double, string> dic = new Dictionary<double, string>();
double highest = double.MinValue;
string result = null;
foreach(double d in dic.keys)
{
if(d > highest)
{
result = dic[d];
highest = d;
}
}
答案 11 :(得分:-1)
您可以通过Count属性访问任何Collection对象的最后一个元素,而不是像其他大多数答案一样使用Linq(有关详细信息,请参阅ICollection.Count Property)。
请参阅此处的代码,了解如何使用count访问任何Collection(包括Dictionary)中的final元素的示例:
Dictionary<double, string> dic = new Dictionary<double, string>();
var lastElementIndex = dic.Count - 1;
var lastElement = dic[lastElementIndex];
请注意,这会返回最后一个 VALUE ,而非键。