向 DataTable 添加多行

2023-11-23

我知道有两种方法将带有数据的新行添加到DataTable

string[] arr2 = { "one", "two", "three" };
dtDeptDtl.Columns.Add("Dept_Cd");

for (int a = 0; a < arr2.Length; a++)
{
    DataRow dr2 = dtDeptDtl.NewRow();
    dr2["Dept_Cd"] = DeptCd[a];
    dtDeptDtl.Rows.Add(dr2);
}

for (int a = 0; a < arr2.Length; a++)
{
    dtDeptDtl.Rows.Add();
    dtDeptDtl.Rows[a]["Dept_Cd"] = DeptCd[a];
}

上述两种方法都会给我相同的结果,即一二三将被添加到DataTable在单独的行中。

但我的问题是,这两个步骤之间有什么区别,哪一个在性能方面更好?


一些反编译器的观察结果

在这两种情况下,不同的过载System.Data.DataRowCollection.Add正在使用方法。

第一种方法使用:

public void Add(DataRow row)
{
    this.table.AddRow(row, -1);
}

第二种方法将使用:

public DataRow Add(params object[] values)
{
    int record = this.table.NewRecordFromArray(values);
    DataRow dataRow = this.table.NewRow(record);
    this.table.AddRow(dataRow, -1);
    return dataRow;
}

现在,看看这个小野兽:

internal int NewRecordFromArray(object[] value)
{
    int count = this.columnCollection.Count;
    if (count < value.Length)
    {
        throw ExceptionBuilder.ValueArrayLength();
    }
    int num = this.recordManager.NewRecordBase();
    int result;
    try
    {
        for (int i = 0; i < value.Length; i++)
        {
            if (value[i] != null)
            {
                this.columnCollection[i][num] = value[i];
            }
            else
            {
                this.columnCollection[i].Init(num);
            }
        }
        for (int j = value.Length; j < count; j++)
        {
            this.columnCollection[j].Init(num);
        }
        result = num;
    }
    catch (Exception e)
    {
        if (ADP.IsCatchableOrSecurityExceptionType(e))
        {
            this.FreeRecord(ref num);
        }
        throw;
    }
    return result;
}

特别要注意的是this.columnCollection[i][num] = value[i];,这将调用:

public DataColumn this[int index]
{
    get
    {
        DataColumn result;
        try
        {
            result = (DataColumn)this._list[index];
        }
        catch (ArgumentOutOfRangeException)
        {
            throw ExceptionBuilder.ColumnOutOfRange(index);
        }
        return result;
    }
}

继续前进,我们发现实际上_list is an ArrayList:

private readonly ArrayList _list = new ArrayList();

结论

为了总结以上内容,如果您正在使用dtDeptDtl.Rows.Add();代替dtDeptDtl.Rows.Add(dr2);,你会得到一个性能下降随着列数的增加,它将呈指数级增长。退化的负责线路是调用NewRecordFromArray方法,该方法迭代ArrayList.

注意:如果您向表中添加 8 列并在其中进行一些测试,则可以轻松测试这一点for循环1000000次。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

向 DataTable 添加多行 的相关文章

随机推荐

  • Python argparse:可以命名或位置的命令行参数

    我正在尝试制作一个使用以下命令的 Python 程序argparse解析命令行选项的模块 我想创建一个可以命名或位置的可选参数 例如 我想要myScript username batman做同样的事情myScript batman 我也想要
  • GMap .net 离线

    我正在使用 C 中的 Gmap 很棒的 AP I 顺便说一句 开发一个应用程序 不要与 google map API 混淆 从那时起我做了一些非常酷且有用的东西 我的问题是我的一些客户没有互联网连接 这就是为什么我需要能够离线显示背景 地图
  • Async.Catch 不适用于 OperationCanceledException

    我使用 Async Catch 来处理异步工作流程引发的异常 work gt Async Catch gt Async RunSynchronously gt fun x gt match x with Choice1Of2 gt succ
  • Python Pandas:将嵌套字典转换为数据帧

    我有一个这样的迪克 1 tp 26 fp 112 2 tp 26 fp 91 3 tp 23 fp 74 我想转换成这样的数据框 t tp fp 1 26 112 2 26 91 3 23 74 有人知道怎么做吗 Try DataFrame
  • InputText 组件中的默认文本(占位符)

    我想在 JSF Primefaces 中显示默认的信息文本输入文本成分 当用户单击文本字段时 该文本应该消失 当他点击外部而不输入任何内容时出现 如果用户提交的表单没有任何值 则不应将此默认值设置为 Bean 的属性 我知道在 Manage
  • quarkus 整个包的本机反射配置

    我正在构建 quarkus 本机并使用 Stripe sdk 作为外部库 为了支持 Stripe sdk 我需要创建反射配置 json文件并在 application properties 中设置quarkus native additio
  • 如何强制gdb在程序执行开始后立即停止?

    我尝试在每个有意义的函数上设置断点 但程序在到达其中任何一个之前退出 有没有办法让程序从一开始就以逐步模式运行 以便我可以看到发生了什么 我正在尝试调试 usr bin id 如果它很重要 我们有它的自定义插件 但它的行为不正确 附 启动命
  • 为什么可以内联初始化静态常量变量而不是普通静态变量(C++)

    如果我这样做 class Gone public static const int a 3 它有效 但如果这样做 class Gone public static int a 3 它给出了一个编译错误 现在我知道为什么第二个不起作用 我只是
  • 如何将DLU转换为像素?

    Microsoft 在其 UI 指南中使用对话长度单位 DLU 如何将它们转换为像素 据我所知 DLU取决于系统字体大小 您能建议一些在 Delphi for Win32 中进行此类转换的简单方法吗 首先我们从what对话单元是 为此我将引
  • 如何在prometheus yml配置文件中配置特定IP?

    我想使用特定的 IP 地址运行 Prometheus 默认情况下 它在本地主机上运行 我在中没有看到任何这样的选项普罗米修斯配置 您可以使用命令行选项来配置监听地址 prometheus web listen address 0 0 0 0
  • 在 UIView 中创建内部阴影[重复]

    这个问题在这里已经有答案了 我想在我的身上创造一个内在的阴影UIView在 iPad 上这样 This UIView可以改变大小 所以我不能使用简单的图像来创建这种阴影 我已经测试过setShadow等等 但它只是创建了一个投影 知道如何创
  • 从 SharedPreferences 设置和获取 StringSet?

    我正在构建一个 Android 应用程序 我想在首选项中存储一组字符串 以便根据登录信息跟踪谁使用了该应用程序 我不想使用数据库 所以我知道我应该使用 SharedPreferences 来存储登录人员的列表 我希望能够重置此列表 以便将个
  • 使用中位数和分组依据以及谷歌表格进行查询

    我需要获得分组中位数 我已经对表单的数据进行了分组 From type Weight A person person 4 A person person 3 A person organization 11 A person person
  • 在 QToolTip 中使用图片或图像

    有没有办法在 QToolTip 中显示图片 图像 我想显示键盘按钮的小图像 以向用户解释他可以在该特定小部件上使用哪些按钮 快捷方式 您可以使用以下 html 代码轻松显示图像 QToolTip showText QCursor pos i
  • AngularJS 和谷歌云端点:需要演练

    我是 AngularJS 的新手 但我真的很喜欢 AngularJS 的工作方式 因此我想将其部署为我的 Google 云端点后端的客户端 然后我立即遇到两个问题 1 放在哪里我的回调 那么它能够在 ANGularJs 控制器中工作吗 2
  • 在字符串中包含常量而不连接

    PHP 中有没有一种方法可以在字符串中包含常量而无需连接 define MY CONSTANT 42 echo This is my constant MY CONSTANT No 对于字符串 PHP 无法区分字符串数据和常量标识符 这适用
  • 使用元素求幂加速嵌套 for 循环

    我正在编写一个大型代码 我发现自己需要加速其中的特定部分 我创建了一个MWE如下图所示 import numpy as np import time def random data N Generate some random data r
  • 如何以编程方式打开 Safari 扩展 ToolbarItem 弹出窗口

    我想以编程方式触发 Safari 扩展工具栏项目上的 单击 事件 以便在网页上发生某些情况后出现我的自定义弹出窗口 我正在使用新的 Xcode 扩展 IDE 并使用界面生成器构建了我的弹出窗口 目前 StackOverflow 上的所有答案
  • 使用 .bat 文件运行 php 脚本

    我需要每天晚上在我的服务器上运行一个 php 脚本 在 Linux 系统上我设置了一个 cron 作业 但我被困在 Windows 系统上 我知道我必须使用 Windows 任务计划程序设置一个任务 并且该任务需要运行一个 bat 文件 该
  • 向 DataTable 添加多行

    我知道有两种方法将带有数据的新行添加到DataTable string arr2 one two three dtDeptDtl Columns Add Dept Cd for int a 0 a lt arr2 Length a Data