問題
我有一個包含幾列和幾行的 DataTable。這些列名稱之一是“登錄”。此資料表中的某些行具有相同的“登錄”列。例如,“登錄”為 2 行test123。我需要一個只包含這 2 行之一的新資料表(哪一行無關緊要)。
問題
如何從舊的 DataTable 創建一個新的 DataTable,過濾掉“登錄”列中具有重復條目的行。新的 DataTable 應該具有與舊 DataTable 相同的結構/列。實際上,在應用過濾器并找到一些匹配項后,只有Rows.Count更改。
到目前為止我嘗試了什么
Dim distinctDT As DataTable = myDT.DefaultView.ToTable(True, "logon")--> 只給我一個帶有一列(“登錄)”的資料表。雖然過濾了唯一值,但它只包含一個列 - >如果我傳入一個包含我所有列名的陣列,它不再過濾唯一值。Dim names = From row In myDataTable.AsEnumerable() Select row.Field(Of String)("Name") Distinct--> 給我一個具有唯一值的字串陣列 --> 我需要一個與以前具有相同列的 DataTable
uj5u.com熱心網友回復:
允許根據特定列的值過濾 DataTable 的 DataRows 的幾個選項,以生成帶有結果 DataRows 的新 DataTable。
考慮到 - 既然你提到了 - 選擇哪個 DataRow 并不重要,即任何重復的DataRow 都會這樣做:(
如果要選擇的 DataRow 在某些時候變得重要,你也可以OrderBy()使用另一個 Column 的值進行分組,然后選擇有序集合中的第一個或最后一個 DataRow)
按 Column 的值對 DataRows 進行分組:
- 使用 Column 的值對源 DataTable 的 DataRows 進行分組
- 選擇每個分組的第一個 DataRow
- 呼叫
CopyToDataTable()方法生成新的DataTable
導致:
Dim newDt = [DataTable].AsEnumerable().
GroupBy(Function(r) r("[Column Name]")).
Select(Function(g) g.First()).
CopyToDataTable()
使用自定義 EqualityComparer:
- 構建一個簡單的 EqualityComparer 類,用于比較兩個 DataRows 物件的相同 Column 的值
- 使用該
Distinct()方法并傳遞自定義的 EqualityComparer,使用用作比較器的 Column 的名稱進行初始化 - 呼叫
CopyToDataTable()方法
這種方法的優點是可重用(即不需要重新構建查詢,只需用要比較的Column的名稱初始化比較器)
導致:
Dim newDt = [DataTable].AsEnumerable().
Distinct(New DataRowColumnComparer("[Column Name]")).
CopyToDataTable()
Custom EqualityComparer:
這是一種基本的比較器。您當然可以擴展它以使用不同的索引器(表示列索引的整數或 DataColumn 參考)。
Public Class DataRowColumnComparer
Implements IEqualityComparer(Of DataRow)
Private ReadOnly t As String = String.Empty
Public Sub New(key As String)
If String.IsNullOrEmpty(key) Then Throw New ArgumentException("Empty key")
t = key
End Sub
Public Overloads Function Equals(dr1 As DataRow, dr2 As DataRow) As Boolean Implements IEqualityComparer(Of DataRow).Equals
If dr1 Is Nothing AndAlso dr2 Is Nothing Then Return True
If dr1 Is Nothing OrElse dr2 Is Nothing Then Return False
Return dr1(t).Equals(dr2(t))
End Function
Public Overloads Function GetHashCode(dr As DataRow) As Integer Implements IEqualityComparer(Of DataRow).GetHashCode
If dr(t) Is Nothing OrElse dr(t) Is DBNull.Value Then Return 0
Return dr(t).GetHashCode()
End Function
End Class
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/484091.html
上一篇:沒有外鍵的Linq多對多關系
