加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

C#数据结构问题(要使用哪个集合?)

发布时间:2020-12-15 19:54:30 所属栏目:百科 来源:网络整理
导读:我需要实现一个大的Widget对象集合,每个对象都包含一个唯一的文件路径字符串(“FilePath”).我需要能够做到以下几点: 根据文件路径快速检索Widget对象 更改Widget的文件路径而不创建新对象(多个其他对象可能包含对单个Widget的引用,并且跟踪它们会影响性能)
我需要实现一个大的Widget对象集合,每个对象都包含一个唯一的文件路径字符串(“FilePath”).我需要能够做到以下几点:

>根据文件路径快速检索Widget对象
>更改Widget的文件路径而不创建新对象(多个其他对象可能包含对单个Widget的引用,并且跟踪它们会影响性能)
>给定Widget参考,确定它的文件路径

我首先想到使用文件路径作为键来使用通用的SortedList,但是复制数千个对象的路径可能会很快占用内存.我考虑从对象中删除路径并仅将其存储在密钥列表中,但这会使上面的要求3难以实现.

我现在倾向于滚动从List<>派生的我自己的类.以排序顺序添加Widget对象,并使用二进制搜索检索它们.只需从列表中删除一个对象,更改它的文件路径,然后将其添加回列表,即可完成要求2.

但我对C#比较陌生,我想在这里检查一下好心人,看看我是否错过了另一个明显的解决方案.

谢谢!

解决方法

“复制”字符串不会使用两倍的内存:由于字符串是c#中的不可变对象,因此您只需在字典中的每个条目中存储另一个引用(即指针,4或8个字节):

Dictionary<string,Widget> dict = new Dictionary<string,Widget>();
Widget myWidget = GetSomeWidget();
dict.Add(myWidget.Name,myWidget);

您将始终重用窗口小部件属性中的字符串对象,因此只需继续使用dict并将路径作为属性存储在窗口小部件中.

如果您不需要按排序顺序枚举小部件,请不要使用SortedList,它将比Dictionary更慢(O(n log n)插入/删除/检索与O(n)平均时间相比)

更改窗口小部件的路径将需要您从字典中删除它并使用更改的路径添加它,但这是一个平均的恒定时间操作,所以它应该非常快.

而且还要提一下:即使您需要花费一MB的额外内存来获得更高的性能或使用更适合(且经过良好测试的)数据结构,我也不认为这会是一个很大的问题.这些天其他应用程序正在使用的内存量(浪费?)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读