优化 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 的元素没有合理的 GetHashCodeEquals 实现,您可能还需要将 IEqualityComparer<ICoreItem> 指定为 HashSet 构造函数的第二个参数。