C# System.Collections.Generic.SortedList的SetByIndex等效项
System.Collections.SortedList有一个便宜的SetByIndex方法,O(1),因为数据结构的性质。此类的泛型版本没有SetByIndex方法。我正在寻找System.Collections.Generic中SortedList实现的等效操作 这两个类都使用排序数组实现字典。由于底层结构是一个数组,因此可以通过索引高效地访问条目。非泛型版本还提供了一个GetByIndex方法,该方法通过索引(而不是键)检索值。通用SortedList还支持通过.Values属性按索引进行检索。当我试图通过.Values属性修改元素时,我得到一个异常,该异常表示“SortedList嵌套类型不支持此操作,因为它们需要修改原始SortedList。” 我不是面向对象设计方面的专家,但为什么不让我通过SortedList返回的“嵌套类型”修改值呢 对于这个项目,我使用.NET4.0。我需要SortedList,这样我就可以按排序顺序遍历项目。基于分析,程序中最昂贵的调用树涉及按索引(以及按键排序顺序)遍历一堆小的SortedList中的项,并修改某些值。目前,为了执行该值修改步骤,我必须使用键进行赋值,这涉及到日志(n)字符串比较操作来定位正确的插槽,而不是简单地通过索引(即SetByIndex)赋值,这将是零比较。我不会更改键,因此不会影响值在数组中的位置 19%(不含)在System.String.CompareTo(String)中花费的程序总时间,几乎所有时间都来自修改值的方法 示例代码用于说明:C# System.Collections.Generic.SortedList的SetByIndex等效项,c#,.net-4.0,C#,.net 4.0,System.Collections.SortedList有一个便宜的SetByIndex方法,O(1),因为数据结构的性质。此类的泛型版本没有SetByIndex方法。我正在寻找System.Collections.Generic中SortedList实现的等效操作 这两个类都使用排序数组实现字典。由于底层结构是一个数组,因此可以通过索引高效地访问条目。非泛型版本还提供了一个GetByIndex方法,该方法通过索引(而不是键)检索值。通用SortedList还支持通过.Values属性按索引进
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
}
}
}
类容器
{
只读System.Collections.Generic.SortedList映射;
无效合并(输入数据)
{
for(int i=0;i
使用SortedList
上的Values
属性获取排序列表中所有值的IList
。然后可以通过索引获取值,这是一个O(1)操作,例如mySortedList.Values[i]
如果值类型是结构,则可以使用
ref
将其与新属性值一起传递给方法,并更新方法中的属性。实际上不建议使用可变结构,但是,如这里所述:是的,我可以按照您建议的方式按索引获取值,如示例代码中所示。问题是如何通过索引设置值。试图通过IList进行设置。值会引发“SortedList嵌套类型不支持此操作,因为它们需要修改原始SortedList。”错误我已编辑了答案,其中可能包含如何设置值的问题。这可能不是理想的解决方案,但希望能引起一些思考。使用SortedList上的属性访问器获取结构值将复制该值,因此通过ref传递不会修改SortedList上的值,它只会修改检索到的副本。