DataTable.选择vs列表.FindAll

本文关键字:FindAll 列表 vs 选择 DataTable | 更新日期: 2023-09-27 18:02:05

TL;DR版本

我在DataTableList<MyData>中有一些来自数据库的数据。

由于我想遵循OO原则,我更喜欢处理List<MyData>中的数据,但在性能方面,我遇到了一些麻烦。

对于大约150k个项目,myDataList.FindAll(x=>x.Id == someId)花费大约15毫秒,而在另一侧,myDataTable.Select($"ID == {someId}")StopWatch不能计时1毫秒的情况下完成。

由于我需要对我的数据进行数千次搜索,每次搜索15毫秒很快就会加起来。

是否有其他列表类型i可以使用,而不是回退到DataTable.Select()返回的DataRow[]?还是我在这里错过了什么?

详细版本

我有一个应用程序,它从数据库中的两个不同表读取数据,并需要对这些数据进行计算。

遵循OO原则,我得到了两个对象列表:List<MyClass> myClassListList<MyOtherClass> myOtherClassList

由于这两个表中的数据之间存在关系(通过ID列(,我现在想将它们移到另一个类中,该类将它们组合为一个业务对象:List<MyBusinessObject> myBusinessObjectList

所以我做了以下事情:

foreach (var id in myIdList)
{
    var myTmpClassList = myClassList.FindAll(x => x.Id == id);
    var myTmpOtherClassList = myOtherClassList.FindAll(x => x.Id == id);
    myBusinessObjectList.Add(new MyBusinessObject(myTmpClassList, myTmpOtherClassList );
}

一个表中大约有35k个条目,另一个表有160k个条目。这个过程每次迭代大约需要15毫秒,很快就会累积起来。

在的另一边

var dic1 = new Dictionary<string, DataRow[]>;
var dic2 = new Dictionary<string, DataRow[]>;
foreach (var id in myIdList)
{
    dic1.Add(id, myDataTable.Select($"ID == {id}");
    dic2.Add(id, myOtherDataTable.Select($"ID == {id}");
}

很快就完成了。

但由于我更喜欢处理Objects而不是Dictionary<string, DataRow[]>,我想知道是否还有其他方法可以采用。

DataTable.选择vs列表.FindAll

此处为

foreach (var id in myIdList)
{
    var myTmpClassList = myClassList.FindAll(x => x.Id == id);
    var myTmpOtherClassList = myOtherClassList.FindAll(x => x.Id == id);
    myBusinessObjectList.Add(new MyBusinessObject(myTmpClassList, myTmpOtherClassList );
}

每个id执行2次线性搜索,导致O(K * (N + M))的时间复杂性(其中K = myIdList.CountN = myClassList.CountM = myOtherClassList.Count(。

您可以使用LINQ组联接来关联数据,这使用了非常高效的基于哈希的实现,从而导致了线性时间复杂性操作:

var myBusinessObjectList =
    (from id in myIdList
     join x in myClassList on id equals x.Id into myClassGroup
     join y in myOtherClassList on id equals y.Id into myOtherClassGroup
     select new MyBusinessObject(myClassGroup.ToList(), myOtherClassGroup.ToList())
    .ToList();