优化相等方法的性能以标记DataGrid中的多个行

时间:2015-02-25 15:01:21

标签: c# .net wpf datagrid equals

我有以下方法:

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个项目。

有没有办法优化方法?

1 个答案:

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