相关疑难解决方法(0)

为什么可变结构"邪恶"?

在这里讨论了SO之后,我已经多次读过可变结构是"邪恶"的评论(就像这个问题的答案一样).

C#中可变性和结构的实际问题是什么?

c# struct mutable immutability

470
推荐指数
15
解决办法
7万
查看次数

SetByIndex 等效于 System.Collections.Generic.SortedList

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(string) 花费的总程序时间的 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, …
Run Code Online (Sandbox Code Playgroud)

c# .net-4.0

5
推荐指数
1
解决办法
619
查看次数

标签 统计

c# ×2

.net-4.0 ×1

immutability ×1

mutable ×1

struct ×1