Datatable筛选中Foreach、Linq、Select几种方法效率比较

假设要在Datatable中选出符合要求的一串数据,可以有Foreach循环、Linq语句和Select语句几种方法,构造一个简单数据后做了下效率对比,发现Linq最慢,其次Foreach,最快是Select。

代码如下:

        static void Main(string[] args)
        {
            int dataCount = 100000;
            DataTable dt = new DataTable();
            dt.Columns.Add("MacID", typeof(int));
            dt.Columns.Add("DevID");

            DataColumn[] keys = new DataColumn[1];
            keys[0] = dt.Columns[0];
            dt.PrimaryKey = keys;

            for (int i = 0; i < dataCount; i++)
            {
                DataRow dr = dt.NewRow();
                dr["MacID"] = i;
                dr["DevID"] = dataCount - i;
                dt.Rows.Add(dr);
            }

            long startTick;
            long stopTick;

            // Foreach
            int filterCount = 0;
            startTick = DateTime.Now.Ticks;
            foreach (DataRow item in dt.Rows)
            {
                if ((int)item[0] > 200)
                {
                    filterCount++;
                }
            }
            Console.WriteLine("ID > 200: " + filterCount);
            stopTick = DateTime.Now.Ticks;
            Console.WriteLine("Foreach " + (stopTick - startTick));

            // Linq
            startTick = DateTime.Now.Ticks;
            var newList = (from item in dt.AsEnumerable()
                           where item.Field<int>(0) > 200
                           select item).ToList();
            Console.WriteLine("ID > 200: " + newList.Count);
            stopTick = DateTime.Now.Ticks;
            Console.WriteLine("LINQ " + (stopTick - startTick));

            // SELECT
            startTick = DateTime.Now.Ticks;
            var filterResult = dt.Select("MacID > 200");
            Console.WriteLine("ID > 200: " + filterResult.Count());
            stopTick = DateTime.Now.Ticks;
            Console.WriteLine("SELECT " + (stopTick - startTick));

            Console.ReadLine();
        }

运行后得到如下结果:

Foreach 120014

LINQ 340026

SELECT 79994

SELECT效率最高,但具体也得看数据表是如何建立索引的,不同的索引对搜索结果有较大影响,LINQ效率居然低于Foreach,这是挺意外的,目前并不清除为什么会比Foreach更加耗时。

时间: 2024-10-10 08:55:01

Datatable筛选中Foreach、Linq、Select几种方法效率比较的相关文章

QT中获取选中的radioButton的两种方法(动态取得控件的objectName之后,对名字进行比较)

QT中获取选中的radioButton的两种方法 QT中要获取radioButton组中被选中的那个按钮,可以采用两种如下两种办法进行: 方法一:采用对象名称进行获取 代码: 1 QRadioButton* pbtn = qobject_cast<QRadioButton*>(ui->BG->checkedButton()); 2 QString name = pbtn->objectName(); 3 if(!QString::compare(name, "rad

oracle 查询当天记录 三种方法效率比较

-- 查询一表中当天生成的数据 -- 原表mobilefrends中的cdate字段上有索引,创建索引语句是:create index mobilefrends_cdate_idx on mobilefrends(cdate); --------------------------------------------------------------------------------------------------------------------- -- 方法一:用to_char()

DataTable添加列和行的三种方法

#region 方法一: DataTable tblDatas =new DataTable("Datas"); DataColumn dc =null; dc = tblDatas.Columns.Add("ID", Type.GetType("System.Int32")); dc.AutoIncrement =true;//自动增加 dc.AutoIncrementSeed =1;//起始为1 dc.AutoIncrementStep =1

QT中获取选中的radioButton的两种方法

QT中要获取radioButton组中被选中的那个按钮,可以采用两种如下两种办法进行: 方法一:采用对象名称进行获取 代码: 1 QRadioButton* pbtn = qobject_cast<QRadioButton*>(ui->BG->checkedButton()); 2 QString name = pbtn->objectName(); 3 if(!QString::compare(name, "radioButton")) 4 { 5 QM

mybatis学习之路----批量更新数据两种方法效率对比

原文:https://blog.csdn.net/xu1916659422/article/details/77971696/ 上节探讨了批量新增数据,这节探讨批量更新数据两种写法的效率问题. 实现方式有两种, 一种用for循环通过循环传过来的参数集合,循环出N条sql, 另一种 用mysql的case when 条件判断变相的进行批量更新 下面进行实现. 注意第一种方法要想成功,需要在db链接url后面带一个参数  &allowMultiQueries=true 即:  jdbc:mysql:

C#将DataTable数据导出到EXCEL的两种方法

1.在非服务器控件的页面导出数据,需要借助一张temp空页面post回后台的数据. 前台:window.location.href = "../Temp.aspx"; 后台: try{ dtSource = Session["MyDataTable"] //假设数据在Session中 if (dtSource == null || dtSource.Rows.Count == 0)            {                return;       

[.Net] DataTable添加列和行的三种方法

#region 方法一: DataTable tblDatas =new DataTable("Datas"); DataColumn dc =null; dc = tblDatas.Columns.Add("ID", Type.GetType("System.Int32")); dc.AutoIncrement =true;//自动增加 dc.AutoIncrementSeed =1;//起始为1 dc.AutoIncrementStep =1

让当前选中栏目高亮显示的一种方法

<ul class="menucontent" id="menucontent"> <li><a href="/WEBUI/Home/Index" url="Index" class="top">@(Resource.layout_menu_index)</a></li> <li><a href="/WEBUI/Lock

50种方法优化SQL Server数据库查询(转载)

原文地址:http://www.cnblogs.com/zhycyq/articles/2636748.html 查询速度慢的原因很多,常见如下几种: 1.没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷) 2.I/O吞吐量小,形成了瓶颈效应. 3.没有创建计算列导致查询不优化. 4.内存不足 5.网络速度慢 6.查询出的数据量过大(可以采用多次查询,其他的方法降低数据量) 7.锁或者死锁(这也是查询慢最常见的问题,是程序设计的缺陷) 8.sp_lock,sp_who,活动的用