我有以下方法:
private void SelectingCoreItems(SortedList<ICoreItem, ICoreItem> sortedList)
{
for (int i = 0; i < VisibleCoreItems.Count; i++)
{
CoreItem currentItem = VisibleCoreItems[i];
if (sortedList.ContainsKey(currentItem))
{
itemListView.SelectedItems.Add(currentItem);
}
}
}
我想标记所有相同的项目。这可行,但性能非常差,因为sortedList包含10,000个项目,VisibleCoreItems包含超过200,000个项目。
有没有办法优化方法?
答案 0 :(得分:3)
您可以使用HashSet<ICoreItem>
代替SortedList<ICoreItem, ICoreItem>
:
private void SelectingCoreItems(SortedList<ICoreItem, ICoreItem> sortedList)
{
var lookup = new HashSet<ICoreItem>(sortedList.Select(i => i.Key));
for (int i = 0; i < VisibleCoreItems.Count; i++)
{
CoreItem currentItem = VisibleCoreItems[i];
if (lookup.Contains(currentItem))
{
itemListView.SelectedItems.Add(currentItem);
}
}
}
此外,比较ICoreItem
接口的实例(取决于实现)可能会很慢。如果它们包含sortedList
中元素唯一的属性(例如,Id
),则可能需要将此属性用于lookup
集。
修改即可。如果sortedList
的元素没有合理的GetHashCode
和Equals
实现,您可能还需要将IEqualityComparer<ICoreItem>
指定为HashSet
构造函数的第二个参数。