Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 对于大数据,循环速度较慢_C#_For Loop_Devexpress - Fatal编程技术网

C# 对于大数据,循环速度较慢

C# 对于大数据,循环速度较慢,c#,for-loop,devexpress,C#,For Loop,Devexpress,我正在使用devexpress控件。以下代码用于selectionChanged事件。当数据量很大时,这种for循环会导致性能降低。我们有没有办法优化这个 for (int i = 0; i < gridView.RowCount; i++) { int currentHandle = gridView.GetVisibleRowHandle(i); var row = gridView.GetRow(cu

我正在使用devexpress控件。以下代码用于selectionChanged事件。当数据量很大时,这种for循环会导致性能降低。我们有没有办法优化这个

         for (int i = 0; i < gridView.RowCount; i++)
         {
            int currentHandle = gridView.GetVisibleRowHandle(i);
            var row = gridView.GetRow(currentHandle) as xxxx;

            if (gridView.IsRowSelected(currentHandle) && !listSelectedItems.Contains(row))
            {
              listSelectedItems.Add(row);
            }
            else if (!gridView.IsRowSelected(currentHandle) && listSelectedItems.Contains(row))
            {
              listSelectedItems.Remove(row);
            }
         }

         gridControl2.Datasource = listSelectedItems;
         //sometimes refresh datasource is also slow and I tried using beginupdate and endupdate but they never helped
         gridControl2.RefreshDatasource();
for(int i=0;i
对于
gridControl2
使用
BindingList
。使用
BindingList
无需每次刷新
gridControl2

private BindingList<SomeClass> _selected;
SelectionChanged
事件中,使用
SelectionChangedEventArgs
对象及其
SelectionChangedEventArgs.Action
成员。并使用
GridView.GetSelectedRows()
方法获取视图中所有选定的行。
下面是一个例子:

private void gridView1_SelectionChanged(object sender, DevExpress.Data.SelectionChangedEventArgs e)
{
    switch (e.Action)
    {
        case CollectionChangeAction.Add:
            var addedRow = (SomeClass)gridView1.GetRow(e.ControllerRow);

            if (!_selected.Contains(addedRow)) //You need this check only when gridView1.OptionsSelection.MultiSelectMode == GridMultiSelectMode.CellSelect
                _selected.Add(addedRow);
            break;
        case CollectionChangeAction.Remove:
            _selected.Remove((SomeClass)gridView1.GetRow(e.ControllerRow));
            break;
        case CollectionChangeAction.Refresh:

            gridView2.BeginDataUpdate();

            _selected.Clear();

            var rows = gridView1.GetSelectedRows().Select(row => (SomeClass)gridView1.GetRow(row));
            foreach (var row in rows)
                _selected.Add(row);

            gridView2.EndDataUpdate();

            break;
    }
}

可能会将
listSelectedItems.Contains()
的返回分配给bool,您在同一个函数中检查它两次,这意味着它将在整个集合中执行两次
Remove()
调用如果调用次数太多,可能会很昂贵。如果不需要按顺序排列所选项目集合,则可以使用
哈希集
private void gridView1_SelectionChanged(object sender, DevExpress.Data.SelectionChangedEventArgs e)
{
    switch (e.Action)
    {
        case CollectionChangeAction.Add:
            var addedRow = (SomeClass)gridView1.GetRow(e.ControllerRow);

            if (!_selected.Contains(addedRow)) //You need this check only when gridView1.OptionsSelection.MultiSelectMode == GridMultiSelectMode.CellSelect
                _selected.Add(addedRow);
            break;
        case CollectionChangeAction.Remove:
            _selected.Remove((SomeClass)gridView1.GetRow(e.ControllerRow));
            break;
        case CollectionChangeAction.Refresh:

            gridView2.BeginDataUpdate();

            _selected.Clear();

            var rows = gridView1.GetSelectedRows().Select(row => (SomeClass)gridView1.GetRow(row));
            foreach (var row in rows)
                _selected.Add(row);

            gridView2.EndDataUpdate();

            break;
    }
}