我会尝试以下方法:
- 如果可能,为 DataGridView 的 ItemsSource 使用 ObservableCollection。
- 将行的 Selected 属性上的绑定添加到 ObservableCollection 中包含的基础项。
- 使用 CollectionViewSource 和过滤器
这是一个非常相似的示例(尽管我怀疑它会执行得非常好):
private ICollectionView _CarListView { get; set; }
private ObservableCollection<Car> _CarList;
public ObservableCollection CarList
{
get
{
if (_CarList == null)
{
//Code to build the list
//For the car filtering
this._CarListView = CollectionViewSource.GetDefaultView(_CarList);
this._CarListView.Filter = CarFilter;
}
return _CarList;
}
}
private bool CarFilter(object item)
{
Car car = item as Car;
if(car.Name.Contains(FilterText))
{
return true;
}
else
{
return false;
}
}
在您的情况下,我只需调整 CarFilter(实际上是 a Predicate<T>
),以便您可以在 DataGridViewRow 中查找绑定到 Selected 属性的属性。例如,您可以在 ObservableCollection 中包含的对象类型上创建一个 IsSelected 布尔值,并在该项目为 true 的地方返回。一旦你有了过滤后的列表结果,然后运行你提到的较小的 id 列表(大约 1000 个元素)并查看 id 匹配的位置。我会尝试对这两个集合使用 LINQ 查询来执行该操作,该操作应该尽可能快。
如果一切都失败了,您可以回到原来的循环技术并尝试并行库来执行 Parallel.ForEach,这将利用您的多核 CPU 更快地执行操作。虽然,我不会蛮力的。似乎您必须通过一次才能从大集合中累积选定的项目,然后在较小的集合中查找每个选定的项目。