我有一個包含以下資料的 DataTable,我想對其進行格式化,并且只有最近幾周的資料。
| ID | 姓名 | 第 1 周 | 第 2 周 | 第 3 周 | 第 4 周 |
|---|---|---|---|---|---|
| 1 | 康納 | 100 | 87 | 3 | 0 |
| 2 | 坦率 | 35 | 70 | 0 | 0 |
| 3 | 杰夫 | 35 | 13 | 0 | 57 |
我想保留前 2 列,然后保留最右邊的不是 0 的列,給我以下內容
| ID | 姓名 | 價值 |
|---|---|---|
| 1 | 康納 | 3 |
| 2 | 坦率 | 70 |
| 3 | 杰夫 | 57 |
我對 LINQ 還是很陌生,所以我有點不確定是否可以這樣做,所以我們將不勝感激。
附加資訊:我忘了提到我正在 UiPath(一種 RPA 工具)中創建解決方案,所以盡管 VB 代碼對于這個實體會更好,但 LINQ 更可取。
uj5u.com熱心網友回復:
Linq 很酷,但作業代碼更酷。Linq 不一定更快。它在內部執行回圈。
您在GetDataTable函式中的代碼將是從 Excel 中提取資料。我剛剛構建了一個 DataTable 來匹配您的示例。
在按鈕單擊事件中,我創建了一個表格來保存結果。外回圈遍歷源中的每一行DataTable。內部For回圈從 中最右邊的列開始,dtSource 然后回傳到第三列(索引 2)。請注意Step -1. 這應該為任何數量的周列的作業,因為我們使用dtSource.Columns.Count - 1只要它發現它增加了一個記錄到非零值dtResult,并退出內部For正在進行中的下一行dtSource。
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim dtSource = GetDataTable()
Dim dtResult As New DataTable
dtResult.Columns.Add("ID", GetType(Integer))
dtResult.Columns.Add("Name", GetType(String))
dtResult.Columns.Add("Value", GetType(Integer))
For Each row As DataRow In dtSource.Rows
For i = dtSource.Columns.Count - 1 To 2 Step -1
If CInt(row(i)) <> 0 Then
dtResult.Rows.Add({row("ID"), row("Name"), row(i)})
Exit For
End If
Next
Next
DataGridView1.DataSource = dtResult
End Sub
Private Function GetDataTable() As DataTable
Dim dt As New DataTable
dt.Columns.Add("ID", GetType(Integer))
dt.Columns.Add("Name", GetType(String))
dt.Columns.Add("Week1", GetType(Integer))
dt.Columns.Add("Week2", GetType(Integer))
dt.Columns.Add("Week3", GetType(Integer))
dt.Columns.Add("Week4", GetType(Integer))
dt.Rows.Add({1, "Conor", 100, 87, 3, 0})
dt.Rows.Add({2, "Frank", 35, 70, 0, 0})
dt.Rows.Add({3, "Jeff", 35, 13, 0, 57})
Return dt
End Function
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/314924.html
