/// <summary> /// 過濾DataTalbe 添加處理(使用hashkey 處理) 最快 /// </summary> /// <param name="dataTable"></param> /// <param name="selectedNodes"></param> /// <returns></returns> public DataTable FilterDataTable(DataTable dataTable, List<string> selectedNodes) { // 使用HashSet而不是List來提高查找性能,如果不關鍵可以忽略這步 var selectedNodesSet = new HashSet<string>(selectedNodes.Select(n => n.Trim()), StringComparer.OrdinalIgnoreCase); // 使用HashSet來存儲我們已經添加過的行的hash值,只在選定列非常多時纔有意義 var rowsAdded = new HashSet<int>(); // 創建新的DataTable的實例 DataTable resultTable = new DataTable(); // 添加所選的列 foreach (var column in dataTable.Columns.Cast<DataColumn>().Where(c => selectedNodesSet.Contains(c.ColumnName.Trim()))) { resultTable.Columns.Add(column.ColumnName, column.DataType); } // 循環處理原始DataTable的每行 foreach (DataRow row in dataTable.Rows) { // 基於選中的列生成一個hash code作爲去重的鍵 int hashCode = selectedNodesSet.Aggregate(17, (current, columnName) => current * 23 + (row[columnName]?.GetHashCode() ?? 0)); // 如果這個hash值尚未遇過,說明這是一個獨一無二的行 if (rowsAdded.Add(hashCode)) { // 用已選的列信息(如果它們存在的話)創建行 DataRow newRow = resultTable.NewRow(); foreach (var columnName in selectedNodesSet) { newRow[columnName] = row[columnName] ?? DBNull.Value; } resultTable.Rows.Add(newRow); } } // 現在的resultTable已經包含了去重後的結果,因而直接返回即可 return resultTable; }