你有种再说一遍 发表于 2025-3-21 03:35:12

cad.net 剔除ElementAt函数

本帖最后由 你有种再说一遍 于 2025-3-21 18:15 编辑

看过一些人写xml很喜欢用ElementAt(targetNum)
包括会用于dictionary这些没有随机访问的,
实际上用这个东西很不好,它是O(n)的,

也就是
int targetNum = 5;
int i = 0;
foreach(var item in xmlNodes) {
    if (i == targetNum) {
      task(item);
      break;
    }
    i++;
}

第二次搜索,那就又从头循环一次了.
第三次搜索,那就又从头循环一次了.
...

对于这种处理手法有几种.
1,如果ElementAt的对象有多次随机访问的需求,
直接var list = dict.ToList();
然后list就得了.

2,直接反序列化xml成类,
类里面就是O(1)寻址速度了.
缺点是如果配置文件很大的话,比较占内存.

3,首先第一次搜索指定节点名,
边搜边存map[节点名]=内容.
搜到直接break.

然后我们就赌一个命中概率,
如果map里面有,直接取map的value内容,
如果没有,我们再进行遍历其他节点,可以记录一个上次中断位置.
如果文件更新,我们通过文件更改事件清理缓存.

然后你可以很容易想到如何淘汰内存呢?
这样不就是LRU算法嘛,
这样我们每次储存几十个节点内容,
然后活跃的置顶,不活跃的淘汰掉

xx

你有种再说一遍 发表于 2025-3-22 03:06:48

我才知道程序域是一个轻量级进程...
页: [1]
查看完整版本: cad.net 剔除ElementAt函数