結論:
- List性能要優於DataGrid,兩者的源碼實現都是基於數組數據結構
- 在增刪DataTable時,會維護一張索引表,性能與List差距很大
- 在遍歷DataTable時,會存在object {System.Data.DataRow} 裝箱操作
- DataTable索引時基於RBTree實現(紅黑二叉樹)
題外話:
- 當我們對讀寫性能都有要求時,建議使用HashTable、Dictionary(哈希表是由數組+鏈表組成)
- Dictionary某些性能要強於HashTable(強類型聲明無需拆裝箱)

using System;
using System.Collections.Generic;
using System.Data;
using System.Diagnostics;
using System.Linq;
namespace ConsoleApp1
{
class Program
{
static void Main()
{
Console.WriteLine("---100w數據讀寫測試---");
DataTable dt = new DataTable();
List<object> list = new List<object>();
Stopwatch sw = new Stopwatch();
sw.Start();
for (int i = 0; i < 1000000; i++)
dt.Rows.Add();
sw.Stop();
Console.ForegroundColor = ConsoleColor.Blue;
Console.WriteLine($"DataTable 空行寫入 {sw.ElapsedMilliseconds} ms");
sw.Restart();
for (int i = 0; i < 1000000; i++)
list.Add(new object());
sw.Stop();
Console.WriteLine($"List<T> 空行寫入 {sw.ElapsedMilliseconds} ms");
sw.Restart();
foreach (var item in dt.Rows) { }
sw.Stop();
Console.ForegroundColor = ConsoleColor.Green;
Console.WriteLine($"DataTable 遍歷 {sw.ElapsedMilliseconds} ms");
sw.Restart();
foreach (var item in list) { }
sw.Stop();
Console.WriteLine($"List<T> 遍歷 {sw.ElapsedMilliseconds} ms");
var dtEnumerable = dt.AsEnumerable();
sw.Restart();
dtEnumerable.FirstOrDefault(p => p != null);
sw.Stop();
Console.ForegroundColor = ConsoleColor.Yellow;
Console.WriteLine($"DataTable Linq Search {sw.ElapsedMilliseconds} ms");
sw.Restart();
list.FirstOrDefault(p => p != null);
Console.WriteLine($"List<T> Linq Search {sw.ElapsedMilliseconds} ms");
sw.Stop();
sw.Restart();
for (int i = dt.Rows.Count - 1; i >= 0; i--)
dt.Rows.RemoveAt(i);
sw.Stop();
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine($"DataTable 刪除 {sw.ElapsedMilliseconds} ms");
sw.Restart();
for (int i = list.Count - 1; i >= 0; i--)
list.RemoveAt(i);
sw.Stop();
Console.WriteLine($"List<T> 刪除 {sw.ElapsedMilliseconds} ms");
object obj = 1;
Console.ReadLine();
}
}
}