我的字典:
Dictionary<double, string> dic = new Dictionary<double, string>();
如何返回字典中的最后一个元素?
我的字典:
Dictionary<double, string> dic = new Dictionary<double, string>();
如何返回字典中的最后一个元素?
“Last”指什么?是指最后添加的值吗?
Dictionary<TKey,TValue>
类是一个无序集合。添加或删除项可能会改变被视为第一个和最后一个元素的内容。因此,没有办法获取最后添加的元素。
可以使用有序字典类SortedDictionary<TKey,TValue>
。但这将基于键值的比较而不是按值添加的顺序进行排序。
编辑
一些人提到了使用以下LINQ风格的方法:
var last = dictionary.Values.Last();
使用这种方法要非常谨慎。它将返回Values集合中的最后一个值,这可能是您添加到字典中的最后一个值,也可能不是。它可能是也可能不是。
字典是无序集合,因此不存在第一个或最后一个元素的概念。如果你想要一个类似于字典但能维护插入顺序的集合,可以考虑使用OrderedDictionary
。
如果你想要一个能对元素进行排序的集合,可以考虑使用SortedDictionary<TKey,TValue>
。
如果你已经有了一个字典,并且你想要根据某个排序顺序找到“最后”的元素,你可以使用 LINQ 对集合进行排序,类似于:
myDictionary.Values.OrderBy( x => x.Key ).Last();
谨慎使用Dictionary.Keys.Last()
- 尽管键列表是使用键类型的默认IComparer
进行排序,但您得到的值可能不是您期望的值。
我知道这个问题太老了,不可能获得任何赞,但我不喜欢任何一个答案,所以我会发表自己的答案,希望为未来的读者提供另一种选择。
假设你想要字典中的最高键值,而不是最后插入的:
以下内容在.NET 4.0上对我没有用:
myDictionary.Values.OrderBy( x => x.Key ).Last();
我怀疑问题在于 'x' 代表字典中的一个值,而值没有键(字典存储键,不存储字典值)。我也可能在使用技术时犯了错误。var lastDicVal = dic.Values.Last();
已经被广泛认为是一个不好的做法。在实践中,该解决方案可能会返回字典中添加的最后一个值(而不是最高键值),但从软件工程的角度来看,这是毫无意义的,不应依赖于它。即使它在未来永远都能正常工作,它仍然代表着代码中的定时炸弹,依赖于库实现的细节。
我的解决方案如下:
var lastValue = dic[dic.Keys.Max()];
使用Keys.max()函数比排序要快得多,时间复杂度是O(n)而不是O(n log n)。 如果性能足够重要,甚至O(n)也太慢的话,可以在单独的变量中跟踪最后插入的键,用它来替换dic.Keys.Max(),这将使整个查找过程尽可能地快,即O(1)。
注意:将double或float作为键不是最佳实践,可能会产生出乎意料的结果,这超出了本文章的范围。请阅读有关浮点/双精度值上下文中“epsilon”的文章。
dic.Keys.Last()
IDictionary<int, string> dic = new SortedDictionary<int, string>();
使用以下方法代替:
Dictionary<double, string>
您可以使用以下方式:
List<KeyValuePair<double, string>>
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;
}
}
来自文档:
为了枚举的目的,字典中的每个项都被视为表示值和其键的KeyValuePair结构。返回项目的顺序是未定义的。
因此,我认为您不能依赖Dictionary
返回最后一个元素。
使用另一个集合。也许是SortedDictionary
...
dic.Values.Last()
您可以使用以下方式:
dic.Last()
但是字典实际上没有最后一个元素(其中的键值对没有按任何特定方式排序)。最后一个项目将始终相同,但不明显它可能是哪个元素。
使用 .Net 3.5:
string lastItem = dic.Values.Last()
string lastKey = dic.Keys.Last()
...但请记住,字典是无序的,因此您不能指望值保持在相同的顺序。