【问题标题】:Most efficient way to loop in a XamDataGrid在 XamDataGrid 中循环的最有效方法
【发布时间】:2018-02-08 09:42:20
【问题描述】:

我正在评估 Infragistics 提供的 XamDataGrid 的性能。特别是,我专注于在 100 万条记录的表中以编程方式选择 500k 条记录。为此,我目前正在执行以下操作:

        Stopwatch s = new Stopwatch();
        var recordsToSelect = new List<DataRecord>(500000);
        s.Start();
        foreach (DataRecord rec in ODataGrid.Records)
        {
            if (rec.Index % 2 == 0)
                recordsToSelect.Add(rec);
        }
        s.Stop();
        Console.WriteLine(s.Elapsed);
        s.Restart();
        ODataGrid.SelectedItems.Records.AddRange(recordsToSelect.ToArray(), false, true);
        s.Stop();
        Console.WriteLine(s.Elapsed);

结果如下:

00:00:14.3122651 for the loop
00:00:00.8765741 to apply the selection

问题显然是循环。我想知道,因为我将 DataTable 绑定为项目源,并且由于 DataTable 上的循环比 XamDataGrid.Records 上的循环快 10 倍,因此有一种方法可以转换 DataRecord 中的 DataRow,或者是否有更快的达到我之前公开的功能目标的方法

编辑

我能够提高性能:

        Stopwatch s = new Stopwatch();
        var recordsToSelect = new List<DataRow>(500000);
        s.Start();
        int i = 0;
        foreach (DataRow rec in d.Rows)
        {
            if (i % 2 == 0)
                recordsToSelect.Add(rec);
            i++;
        }
        s.Stop();
        Console.WriteLine(s.Elapsed);
        s.Restart();
        DataRecord[] dr = ODataGrid.GetRecordsFromDataItems(recordsToSelect.ToArray(), false);
        s.Stop();
        Console.WriteLine(s.Elapsed);
        s.Restart();
        ODataGrid.SelectedItems.Records.AddRange(dr, false, true);
        s.Stop();
        Console.WriteLine(s.Elapsed);

这些时间过去了

00:00:00.0812110
00:00:08.2830562
00:00:01.1774925

问题是DataRecord数组的创建是最慢的部分

【问题讨论】:

    标签: wpf infragistics xamdatagrid


    【解决方案1】:

    为什么要通过数据网格访问项目源?您可以使用 MVVM 方法将您的项目源作为 ObservableCollection 或 List。从您的视图模型中,您可以访问数据源以及您选择的项目。

    【讨论】:

    • 我只是在做性能测试,我需要找出最好的方法,所以在这个阶段我没有创建任何真正的项目。我只是在 wpf appl 中打了一个 XamDataGrid 并用绑定到它的数据表填充它。 XamDataGrid的SelectedItems,不可设置,需要访问SelectedItems.Records才能做任何事情
    • 是的,很清楚。只要您直接使用 UI 元素来获取数据、索引等,您就可以期待不同的性能结果。无论如何,最好的方法是将 UI 与逻辑分开。
    • 在这个阶段,将 UI 与逻辑分开并不重要。这对我很重要,这是使用 .SelectedItems.Records.AddRange 的最快方式,因为它需要一个记录数组,并且循环遍历记录比遍历数据表要慢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-09
    • 2018-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多