由于数据结构的性质,System.Collections.SortedList有一个便宜的SetByIndex方法,O(1)。此类的通用版本没有SetByIndex方法。我正在寻找System.Collections.Generic中的SortedList实现的等效操作。
两个类都使用排序数组实现字典。由于底层结构是一个数组,因此可以通过索引有效地访问这些条目。非泛型版本还提供了一个GetByIndex方法,该方法通过索引(而不是键)检索值。通用的SortedList还支持通过.Values属性通过索引进行检索。当我尝试通过.Values属性修改元素时,我得到一个异常,说明" SortedList嵌套类型不支持此操作,因为它们需要修改原始的SortedList。"
我不是面向对象设计方面的专家,但为什么不让我通过"嵌套类型修改价值"由SortedList返回?
对于这个项目,我在.NET 4.0上。我需要SortedList,所以我可以按排序顺序遍历项目。基于分析,程序中最昂贵的调用树涉及通过索引迭代一堆小SortedLists中的项(按键排序顺序)并修改某些值。目前为了执行该值修改步骤,我必须使用密钥进行分配,该密钥涉及log(n)字符串比较操作以定位适当的时隙而不是简单地通过索引(即SetByIndex)分配值,这将是零比较。我没有更改密钥,因此没有任何东西会影响数组中值的位置。
在System.String.CompareTo(字符串)中花费的总程序时间为19%(不包括),几乎所有这些都来自修改值的方法。
示例代码说明:
class Container
{
readonly System.Collections.Generic.SortedList<string, MapEntryValueType> map;
void Merge(IncomingData data)
{
for(int i=0; i < map.Count; i++)
if(data.ExamineKeyForMatch(map.Keys[i])) //O(1)
{
MapEntryValueType entry = map.Values[i]; //O(1)
entry.something = data.something;
//map.Values[i] = entry; //O(1) no can do, error "This operation is not supported..."
//map.SetByIndex(i, entry); //O(1) no can do, no such method
map[map.Keys[i]] = entry; //O(log n) yucky and slow but works
}
}
}
答案 0 :(得分:0)
使用Values
上的SortedList<TKey, TValue>
属性获取排序列表中所有值的IList<TValue>
。然后,您可以通过索引获取值,这是一个O(1)操作,例如mySortedList.Values[i]
https://msdn.microsoft.com/en-us/library/ms132380(v=vs.110).aspx
如果您的值类型是结构,则可以使用ref
将其与新属性值一起传递给方法,并更新方法中的属性。但是,并不是真的建议使用可变结构,如下所述:pass c# struct by reference?