【发布时间】:2015-08-13 14:32:17
【问题描述】:
我有一个对象列表,我在整个代码中以及当用户与程序交互时对这些对象进行了多次排序。我想知道是否最好将新项目插入列表而不是添加到列表的末尾并重新使用整个列表。
下面的代码用于导入浏览器书签 - 在这里,我将一堆书签添加到 List (this._MyLinks) 中,它们是 Link 对象,然后对最终的 List 进行排序 - 我认为这在给定的场景中可能是最好的.. ..
public void ImportBookmarks(string importFile)
{
using (var file = File.OpenRead(importFile))
{
var reader = new NetscapeBookmarksReader();
var bookmarks = reader.Read(file);
foreach (var b in bookmarks.AllLinks)
{
bool duplicate = this._MyLinks.Any(link => link._URL == b.Url);
if(duplicate)
{
continue;
}
Link bookmark = new Link();
bookmark._URL = b.Url;
bookmark._SiteName = b.Title;
bookmark.BrowserPath = "";
bookmark.BrowserName = "";
if (bookmark.AddToConfig(true))
{
this._MyLinks.Add(bookmark);
}
}
}
this._MyLinks = this._MyLinks.OrderBy(o => o._SiteName).ToList();
}
现在用户还可以选择添加自己的链接(一次一个)。每当用户添加链接时,整个列表都会再次使用
进行排序this._MyLinks = this._MyLinks.OrderBy(o => o._SiteName).ToList();
从性能的角度来看(或只是一般地),将项目直接插入指定位置是否更好?如果是这样,您对我如何才能做到这一点有什么建议吗?
谢谢!
【问题讨论】:
-
@PatrickHofman 这在功能上与将新项目插入列表中间(这就是该类所做的全部)相同,而且效率很低。
-
是什么让
SortedSet变得更好? -
@PatrickHofman 这是一个完全不同的数据结构,具有完全不同的操作及其操作的性能特征。对于这种情况,它可以在 O(log(n)) 时间而不是 O(n) 时间内添加项目,并且完全消除了对集合的额外线性搜索。
-
@OP 如果您需要通过索引访问元素,您必须使用可索引的集合,例如
SortedList(您将无法使用@987654325 @ 带索引), -
@MatthewWatson 他没有这样做,当然有解决这个问题的方法,即使它确实需要,如果它确实需要。