System.Collections.Generic.SortedList

时间:2017-05-31 19:03:03

标签: c# .net-4.0

由于数据结构的性质,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
            }
    }
}

1 个答案:

答案 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?