假設要在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更加耗時。