获取SortedDictionary中的最后一个元素
我看到了这个问题 。
如何在.Net 3.5中获取SortedDictionary中的最后一个元素。
您可以使用LINQ:
var lastItem = sortedDict.Values.Last();
你也可以得到最后一把钥匙:
var lastkey = sortedDict.Keys.Last();
您甚至可以获得最后一个键值对:
var lastKeyValuePair = sortedDict.Last();
这将为您提供具有Key
和Value
属性的KeyValuePair
。
请注意,如果字典为空,这将抛出exception; 如果您不想这样,请拨打LastOrDefault
。
Last
扩展方法将为您提供结果,但它必须枚举整个集合才能实现。 这是一种耻辱SortedDictionary
不会暴露Min
和Max
成员,特别是考虑到内部它由SortedSet
,它具有Min
和Max
属性。
如果不希望O(n),你有几个选择:
-
切换到
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有什么区别? -
编写自己的
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)。 没有记录,但我检查了代码。
-
使用fiddlyreflection来访问后备集,后者集是
SortedDictionary
类的私有成员,并调用Min
和Max
属性。 可以依赖表达式来编译委托并将其缓存以提高性能。 这样做是一个非常糟糕的选择。 不敢相信我建议这个。 -
依赖于其他实现,例如。 对于来自C5的
TreeDictionary
。 他们有FindMin
和FindMax
都是O(log n)
你可以使用SortedDictionary.Values.Last();
或者如果你想要键和值
SortedDictionary.Last();
SortedList列表……
list[ Keys[Keys.Count - 1] ]; // returns the last entry in list