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

时间:2009-06-19 14:13:31

标签: c# .net dictionary

我的字典:

Dictionary<double, string> dic = new Dictionary<double, string>();

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

12 个答案:

答案 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 ,而非键。