C# 对于大数据,循环速度较慢
我正在使用devexpress控件。以下代码用于selectionChanged事件。当数据量很大时,这种for循环会导致性能降低。我们有没有办法优化这个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
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;
}
}