我正在尝试从datagridview中选择所有行\列,其中第一列使用LINQ是唯一的。
的DataGridView:
1 Blue 1111
1 Blue 1111
2 Green 1234
3 Orange 3211
2 Green 1234
4 Red 2222
尝试获取此输出:
1 Blue 1111
2 Green 1234
3 Orange 3211
4 Red 2222
我能够使用以下代码从第一列中提取所有唯一记录,但我不知道如何获取剩余的列:
Dim unique() As String = (From row As DataGridViewRow In dgvMaestro.Rows.Cast(Of DataGridViewRow)() _
Where Not row.IsNewRow _
Select CStr(row.Cells(0).Value)).Distinct.ToArray
For Each a As String In unique
Debug.Print(a)
Next
输出:
1
2
3
4
由于
答案 0 :(得分:2)
首先,你需要使用linq导入2个名称空间,以便在DataTables中使用AsEnumerable()方法,在DataRows中使用Field()方法
Imports System.Data.DataTableExtensions
Imports System.Data.DataRowExtensions
声明新数据表
Dim NewTbl As New System.Data.DataTable
在您的场景中添加列
NewTbl.Columns.Add("ID", GetType(Integer))
NewTbl.Columns.Add("Color", GetType(String))
NewTbl.Columns.Add("Value", GetType(Integer))
Linq使用Table'TblValues'作为数据源
Dim results = (From row in TblValues.AsEnumerable() select col1 = row(Of Integer)("ID"), col2 = row(Of String)("Color"), col3 = row(Of Integer)("Value")).Distinct().ToList()
在每个结果中迭代元素,原因是因为结果是对象数据集合并且不会自动转换为表
For each r in results
Dim Row as System.Data.DataRow = NewTbl.NewRow
Row("ID") = r.col1
Row("Color") = r.col2
Row("Value") = r.col3
NewTbl.Rows.Add(Row)
next
现在你有一个DataTable'NewTbl',里面有不同的值
答案 1 :(得分:0)
解决此问题的最佳方法是编写比较器来比较整行。
Dim noduplicates = dgvMaestro.Rows.Cast(Of DataGridViewRow).Distinct(New RowComparer())
上有一些比较器示例