Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# System.Collections.Generic.SortedList的SetByIndex等效项_C#_.net 4.0 - Fatal编程技术网

C# System.Collections.Generic.SortedList的SetByIndex等效项

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属性按索引进

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)中花费的程序总时间,几乎所有时间都来自修改值的方法

示例代码用于说明:

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上的值,它只会修改检索到的副本。