使用LINQ从Datagridview中选择唯一行

时间:2013-11-18 21:13:17

标签: vb.net linq datagridview distinct

我正在尝试从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

由于

2 个答案:

答案 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())

msdn

上有一些比较器示例