获取SortedDictionary中的最后一个元素

我看到了这个问题 。

如何在.Net 3.5中获取SortedDictionary中的最后一个元素。

您可以使用LINQ:

var lastItem = sortedDict.Values.Last(); 

你也可以得到最后一把钥匙:

 var lastkey = sortedDict.Keys.Last(); 

您甚至可以获得最后一个键值对:

 var lastKeyValuePair = sortedDict.Last(); 

这将为您提供具有KeyValue属性的KeyValuePair

请注意,如果字典为空,这将抛出exception; 如果您不想这样,请拨打LastOrDefault

Last扩展方法将为您提供结果,但它必须枚举整个集合才能实现。 这是一种耻辱SortedDictionary不会暴露MinMax成员,特别是考虑到内部它由SortedSet> ,它具有MinMax属性。

如果不希望O(n),你有几个选择:

  1. 切换到SortedList 。 再次出于某种原因,BCL默认不打包。 您可以使用索引器在O(1)时间内获取最大值(或最小值)。 使用扩展方法扩展将很好。

     //Ensure you dont call Min Linq extension method. public KeyValuePair Min(this SortedList dict) { return new KeyValuePair(dict.Keys[0], dict.Values[0]); //is O(1) } //Ensure you dont call Max Linq extension method. public KeyValuePair Max(this SortedList dict) { var index = dict.Count - 1; //O(1) again return new KeyValuePair(dict.Keys[index], dict.Values[index]); } 

    SortedList附带其他处罚。 所以你可能想看看: SortedList和SortedDictionary有什么区别?

  2. 编写自己的SortedDictionary类。 这非常简单。 将SortedSet>作为内部容器,并将其作为Key部分的比较。 就像是:

     public class SortedDictionary : IDictionary { SortedSet> set; //initialize with appropriate comparer public KeyValuePair Min { get { return set.Min; } } //O(log n) public KeyValuePair Max { get { return set.Max; } } //O(log n) } 

    这是O(log n)。 没有记录,但我检查了代码。

  3. 使用fiddlyreflection来访问后备集,后者集是SortedDictionary类的私有成员,并调用MinMax属性。 可以依赖表达式来编译委托并将其缓存以提高性能。 这样做是一个非常糟糕的选择。 不敢相信我建议这个。

  4. 依赖于其他实现,例如。 对于来自C5的TreeDictionary 。 他们有FindMinFindMax 都是O(log n)

你可以使用SortedDictionary.Values.Last();

或者如果你想要键和值

 SortedDictionary.Last(); 

SortedList列表……

 list[ Keys[Keys.Count - 1] ]; // returns the last entry in list