0

我有一个绑定的datagridview,大约有一百万条记录,可以按任何列排序。在 GUI 中,用户可以选择任意数量的行(有时使用 CTRL+A 来选择所有行)。从另一个来源,我得到了大量记录 ID(最多 1000 个),需要找出哪些 ID 对应于选定的行。我尝试了很多方法,但都没有一个足够快。例如:

遍历选定的行集合并在 ID 列表中查找匹配项是不可能的,因为 SelectedRows 计数可能约为 1/2 百万。

我还尝试循环遍历 ID 的列表(通常大约为 1000),并为每个 ID 执行一个 BindingSource.Find("Id", Value) ,它为我提供每个 ID 的行索引,然后我可以检查是否行被选中。如果网格按 ID 排序,这可以正常工作,但如果不是,则 Find() 的性能太差,无法调用 1000 次。

简而言之,在给定行对象 ID 的情况下,我需要一种快速方法来查找最多 1000 行的 Row.Selected 状态。似乎 DataGridView 或 DataBinding 应该能够处理这个问题,但具体如何处理并不明显。提前致谢!

4

1 回答 1

1

我会尝试以下方法:

  1. 如果可能,为 DataGridView 的 ItemsSource 使用 ObservableCollection。
  2. 将行的 Selected 属性上的绑定添加到 ObservableCollection 中包含的基础项。
  3. 使用 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 更快地执行操作。虽然,我不会蛮力的。似乎您必须通过一次才能从大集合中累积选定的项目,然后在较小的集合中查找每个选定的项目。

于 2012-06-27T01:54:21.263 回答