您的位置:首页 > 其它

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

2014-10-24 10:23 387 查看
假设要在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更加耗时。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: