回覆內容 |
【wwwiii520】: 佔個沙發```搞不懂lz意思
【ezhuyin】: public DataTable SelectDistinct(string TableName, DataTable SourceTable, string FieldName) { DataTable dt = new DataTable(TableName); dt.Columns.Add(FieldName, SourceTable.Columns[FieldName].DataType);
object LastValue = null; foreach (DataRow dr in SourceTable.Select("", FieldName)) { if ( LastValue == null || !(ColumnEqual(LastValue, dr[FieldName])) ) { LastValue = dr[FieldName]; dt.Rows.Add(new object[]{LastValue}); } } if (ds != null) ds.Tables.Add(dt); return dt; }
【outh24】: 如果有LINQ的話就好辦…… 沒有的話,有個笨方法,定義另一個datatable, 從現在的數據源裏取不重複的部分寫入到新的dt中
【fuda_1985】: 關注!
【scjyjl】: 沒找到ColumnEqual,請問要using什麼纔有這個啊,而且我在MSDN中也沒索引到,可以講講嗎
【ezhuyin】: 思路:首先建立一個臨時數據表,然後把源DataTable Sort起來,然後逐行讀取源數據,並且跟最後一次添加的數據比較,如果相同,則不添加,如果不同,則添加進臨時表。做點小改動,則可以適應更多環境。
public DataTable SelectDistinct(string TableName, DataTable SourceTable, string[] FieldNames) { DataTable dt = new DataTable(TableName); System.Text.StringBuilder FiledNameBuilder = new System.Text.StringBuilder(""); string SortStr = "";
foreach (string FieldName in FieldNames) { dt.Columns.Add(FieldName, SourceTable.Columns[FieldName].DataType); FiledNameBuilder.Append(FieldName + ","); }
if (FiledNameBuilder.ToString().Length>0) { SortStr = FiledNameBuilder.ToString(); SortStr = SortStr.Substring(0,SortStr.Length-1); }
object[] LastValue = new object[FieldNames.Length];
foreach (DataRow dr in SourceTable.Select("",SortStr)) { if (LastValue == null || !IsEqual(dr,LastValue)) { for (int i = 0; i < LastValue.Length; i++) { LastValue[i] = dr[FieldNames[i]]; } dt.Rows.Add(LastValue); } } if (ds != null) ds.Tables.Add(dt); return dt; }
private bool IsEqual(DataRow dr, object[] Value) { bool Equal = true; int current = 0;
while (Equal && current < Value.Length) { if (!dr[current].Equals(Value[current])) { Equal = false; } else { current++; } }
return Equal; }
【ezhuyin】: 沒找到ColumnEqual,請問要using什麼纔有這個啊,而且我在MSDN中也沒索引到,可以講講嗎
哈,不好意思,那個是單獨的方法:
private bool ColumnEqual(object A, object B) { if ( A == DBNull.Value && B == DBNull.Value ) // 兩個都是 DBNull.Value return true; if ( A == DBNull.Value || B == DBNull.Value ) // 只有一個是 DBNull.Value return false; return ( A.Equals(B) ); // 正常比較 }
【ezhuyin】: if (!dr[current].Equals(Value[current]))
又一個錯誤,修改成
if (!ColumnEqual(dr[current],Value[current]))
【scjyjl】: 謝謝ezhuyin
|
|