代码之家  ›  专栏  ›  技术社区  ›  Sergey Aldoukhov

为什么使用CollectionViewSource.SortDescriptions进行排序比较慢?

  •  8
  • Sergey Aldoukhov  · 技术社区  · 16 年前

    这是单击 DataGrid . 当基础列表包含100000个项目时,刷新视图大约需要20秒。设置时可以观察到相同的延迟 SortDescription S在A上 CollectionView .

    使用排序 ListCollectionView.CustomSort 或者通过排序和重新分配列表,几乎可以立即工作。

    为什么要延迟?这仅仅是对绑定财产的“反射税”吗?

    2 回复  |  直到 13 年前
        1
  •  9
  •   Anvaka    16 年前

    你说得对,这是一种反射税。前一段时间我非常仔细地观察了数据报的性能,这里的反射是一个瓶颈。无论排序算法有多快,它们都不会缓存两个比较之间的属性值。因此,即使进行n*ln(n)比较,n==100000,也会得到约1000000个操作。每个操作数都使用反射来获取值,因此您有2000 000个调用来在tax中反射:)… ListCollectionView.CustomSort 是这里的理想溶液。

    PS:最后,我们编写了基于ListView的网格,因为我们对DataGrid的渲染性能也不满意…但那是另一个故事:)

        2
  •  1
  •   denis morozov DarthVader    13 年前

    过滤的最佳性能调整是切换DataGridRow可见性。它产生了巨大的差异!

    1.将IsVisible属性添加到将DataGrid的itemsource绑定到的集合项。

    private bool _isVisible = true;
    public bool IsVisible
    {
        get { return _isVisible; }
        set 
        { 
            if (_isVisible == value)
                 return;
            _isVisible = value;
            RaisePropertyChanged(()=>IsVisible);
         }
     }
    

    2.通过将DataGridRow绑定到IsVisible属性来触发它的可见性:

    <DataGrid.ItemContainerStyle>
    <Style TargetType="{x:Type DataGridRow}">
        <Setter Property="Visibility" 
                    Value="{Binding Path=IsVisible, 
                                    Converter={StaticResource BoolToVisibility}}"/>
     </Style>
    </DataGrid.ItemContainerStyle>
    

    3.好吧,你得把“可见”设置在我想也是的某个地方,就像在你的视图模型中一样。以下只是我正在做的一个示例(只是复制/粘贴作业)-基本上,根据其他视图模型中的某些条件,设置可以显示为“真”或“假”。

    FilterViewModel.OnFilter += (s, a) =>
    {
        foreach (Row row in ViewModel.Rows)
        row.IsVisible = !FilterViewModel.FilteringItems.Any(item => 
                                       item.IsSelected && item.Name == row.Name);
    };