优化 equal 方法的性能以标记 DataGrid 中的多行
Optimize performance of a equal method to mark multiple rows in a DataGrid
我有以下方法:
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 个项目。
有没有办法优化方法?
您可以使用 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
构造函数的第二个参数。
我有以下方法:
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 个项目。
有没有办法优化方法?
您可以使用 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
构造函数的第二个参数。