c# - DataTable.Select 与 List.FindAll

标签 c# performance list datatable lookup

TL;DR 版本

我在 DataTable 中有一些来自数据库的数据或者在 List<MyData> .

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

大约有 15 万个项目 a myDataList.FindAll(x=>x.Id == someId)大约需要 15 毫秒,而在另一边是 myDataTable.Select($"ID == {someId}")在没有 StopWatch 的情况下完成能够计时一毫秒。

因为我需要对我的数据执行数千次搜索,每次搜索 15 毫秒的时间加起来很快。

是否有任何其他列表类型我可以使用而不是退回到 DataRow[]DataTable.Select()返回?还是我在这里遗漏了其他东西?

详细版

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

遵循 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}");
}

立即完成。

但因为我更喜欢处理 ObjectsDictionary<string, DataRow[]>我想知道我是否可以采用另一种方法。

最佳答案

这里

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 );
}

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

您可以使用 LINQ group joins用于关联数据,它使用非常有效的基于哈希的实现,从而导致线性时间复杂度操作:

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();

关于c# - DataTable.Select 与 List.FindAll,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38901255/

相关文章:

java - 异常后的线程处理

java - 根据运行时属性对对象列表进行排序

php - 链接列表 php spl 或自定义?

c# - 如何修复其根类需要装饰器实例的装饰器?

c# - 我怎么说不是,不是

c# - 在 MVC Core 应用程序中使用 AddAzureADB2C 时向 ClaimsPrincipal 添加自定义声明

c# - 有人可以告诉我 List、Collection 和 Enumerable 之间有什么区别?

c# - 如何使用反射调用带参数的非泛型静态扩展方法

performance - 隐藏屏幕 SVG 元素

node.js - Node 中的异步uuid生成