C# Datatable篩選過濾的四種方法實(shí)現(xiàn)
在C#中,DataTable提供了多種篩選過濾數(shù)據(jù)的方法,以下是常用的幾種方式及其特點(diǎn):
1. Select方法篩選
這是最基礎(chǔ)的篩選方式,支持類似SQL的表達(dá)式語法
// 單條件篩選 DataRow[] rows = dt.Select("Age > 25"); // 多條件組合 DataRow[] rows = dt.Select("Name LIKE '張%' AND Age > 20"); // 帶排序的篩選 DataRow[] rows = dt.Select("Dept='銷售部'", "HireDate DESC");
特點(diǎn):
- 返回DataRow[]數(shù)組
- 條件表達(dá)式區(qū)分大小寫
- 性能中等,適合中小數(shù)據(jù)集
排序行為(需要注意:有主鍵會改變原始排序)
- 無主鍵表:保持原始添加順序
- 有主鍵表:結(jié)果將按主鍵順序排列
- 顯式指定排序:可通過第二個(gè)參數(shù)控制排序順序
原因分析
DataTable.Select方法內(nèi)部實(shí)現(xiàn)會優(yōu)先考慮主鍵定義的順序,這是為了優(yōu)化數(shù)據(jù)檢索性能。當(dāng)表定義了主鍵時(shí),.NET框架會默認(rèn)按照主鍵順序組織數(shù)據(jù),以提高查詢效率。
// 無排序參數(shù)時(shí)行為 DataRow[] rows1 = dt.Select("Age > 25"); // 順序取決于是否有主鍵 // 顯式指定排序 DataRow[] rows2 = dt.Select("Dept='銷售部'", "HireDate DESC"); // 強(qiáng)制按指定字段排序
2. LINQ查詢
更現(xiàn)代的篩選方式,支持強(qiáng)類型和復(fù)雜邏輯
// 我常使用 var query = dt.AsEnumerable() .Where(row => row["Age"]?.toString() =="25"); // 基礎(chǔ)查詢 var query = dt.AsEnumerable() .Where(row => row.Field<int>("Age") > 25); // 多條件+投影 var results = from row in dt.AsEnumerable() where row.Field<string>("Name").Contains("張") select new { ID = row["ID"], Name = row["Name"] };
優(yōu)勢:
- 編譯時(shí)類型檢查
- 支持復(fù)雜鏈?zhǔn)讲僮?/li>
- 可讀性更好
排序行為
無OrderBy/OrderByDescending:嚴(yán)格保持原始順序
使用排序操作符:按指定規(guī)則重新排序
復(fù)合查詢:最后一個(gè)排序操作決定最終順序
原因分析
LINQ采用延遲執(zhí)行模型,其設(shè)計(jì)原則之一是"不改變源數(shù)據(jù)順序除非顯式要求"。這是函數(shù)式編程思想的體現(xiàn),確保操作的可預(yù)測性。
// 保持原始順序 var query1 = dt.AsEnumerable().Where(row => row.Field<int>("Age") > 25); // 顯式排序 var query2 = from row in dt.AsEnumerable() orderby row.Field<DateTime>("CreateDate") descending select row;
3. DataView過濾
適合需要綁定到UI控件的場景
DataView dv = new DataView(dt); dv.RowFilter = "Status='Active'"; dv.Sort = "CreateTime DESC"; // 綁定到控件 dataGridView1.DataSource = dv;
特點(diǎn):
- 支持實(shí)時(shí)過濾
- 自動(dòng)同步源數(shù)據(jù)變化
- 性能優(yōu)于多次Select調(diào)用
排序行為
- RowFilter 僅過濾不改變順序
- Sort 顯式改變需單獨(dú)設(shè)置
- 兩者組合 按Sort設(shè)置先過濾后排序
原因分析
DataView的設(shè)計(jì)將過濾(RowFilter)和排序(Sort)作為獨(dú)立屬性處理,這是為了支持UI數(shù)據(jù)綁定的靈活需求。這種分離允許開發(fā)者獨(dú)立控制過濾條件和顯示順序
DataView dv = new DataView(dt); dv.RowFilter = "Status='Active'"; // 不影響順序 dv.Sort = "Salary DESC"; // 顯式設(shè)置排序
4. 動(dòng)態(tài)條件構(gòu)建
適用于需要運(yùn)行時(shí)生成條件的場景
string dynamicFilter = $"Age > {minAge}"; if (!string.IsNullOrEmpty(nameFilter)) dynamicFilter += $" AND Name LIKE '%{nameFilter.Replace("'","''")}%'"; DataRow[] rows = dt.Select(dynamicFilter);
排序行為
- 最終取決于使用的底層方法(Select或LINQ)
- 條件表達(dá)式本身不影響排序
原因分析
動(dòng)態(tài)構(gòu)建的條件字符串只是改變了篩選條件,排序行為仍由執(zhí)行篩選的方法決定。這是條件表達(dá)式與排序邏輯解耦的設(shè)計(jì)。
string condition = "Age > 30"; if(includeDepartment) condition += " AND Dept='IT'"; // 排序取決于Select方法的第二個(gè)參數(shù) DataRow[] rows = dt.Select(condition, "Name ASC");
性能對比建議
如何選擇
- 大數(shù)據(jù)集優(yōu)先考慮DataView或添加索引
- 復(fù)雜業(yè)務(wù)邏輯使用LINQ提升可維護(hù)性
- 動(dòng)態(tài)條件注意SQL注入風(fēng)險(xiǎn),建議參數(shù)化
- 頻繁查詢可緩存DataRow[]結(jié)果
特殊字符處理
當(dāng)列名或值包含特殊字符時(shí):
// 列名包含特殊字符 dt.Select("[#Rank] > 5"); // 值包含單引號 dt.Select($"Name='{input.Replace("'","''")}'");:ml-citation{ref="25,42" data="citationList"}
到此這篇關(guān)于C# Datatable篩選過濾各方式實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)C# Datatable篩選過濾內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
c#自定義Attribute獲取接口實(shí)現(xiàn)示例代碼
這篇文章主要給大家介紹了關(guān)于c#自定義Attribute獲取接口實(shí)現(xiàn)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用c#具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09C# 執(zhí)行CMD命令并接收返回結(jié)果的操作方式
這篇文章主要介紹了C# 執(zhí)行CMD命令并接收返回結(jié)果的操作方式,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-04-04用c#實(shí)現(xiàn)簡易的計(jì)算器功能實(shí)例代碼
這篇文章主要介紹了c#實(shí)現(xiàn)簡易的計(jì)算器功能,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-05-05C# .NET中Socket簡單實(shí)用框架的使用教程
最近一個(gè)項(xiàng)目因?yàn)橐玫絊ocket傳輸問題,所以決定學(xué)習(xí)一下,將自己學(xué)習(xí)的內(nèi)容總結(jié)分享出來,下面這篇文章主要給大家介紹了關(guān)于C# .NET中Socket簡單實(shí)用框架使用的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下。2017-09-09Unity接入高德開放API實(shí)現(xiàn)IP定位
這篇文章主要為大家介紹了Unity如何接入高德開放API實(shí)現(xiàn)IP定位功能,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)或工作有一定參考價(jià)值,需要的可以參考一下2022-04-04