将For-Each转换为LINQ查询以在列表中添加项目,并检查wehter列表是否已包含该项目

时间:2016-10-13 10:33:47

标签: vb.net winforms linq

我想将ForEach转换为LINQ。目前我正在使用这两部分

If TypeOf e.FilterPopup Is RadListFilterPopup Then
    Dim ePopup As RadListFilterPopup = DirectCast(e.FilterPopup, RadListFilterPopup)

    Dim childList As New List(Of Object)()
    For Each row As GridViewRowInfo In Me.grdCNCFilesRad.ChildRows

        Dim value = row.Cells(e.Column.Index).Value
        If Not childList.Contains(value) Then
            childList.Add(value)
        End If
    Next


    Dim newPopup As New RadListFilterPopup(e.Column)

    For Each item As System.Collections.ArrayList In ePopup.MenuTreeElement.DistinctListValues.Values
        If Not childList.Contains(item(0)) Then
            newPopup.MenuTreeElement.DistinctListValues.Remove(item(0).ToString())
        End If
    Next

    e.FilterPopup = newPopup
End If

如何使用LINQ查询执行相同的操作?

2 个答案:

答案 0 :(得分:0)

我不知道你的变量grdCNCFilesRad的类型是什么,但我认为它不是.NET类型。但是当我阅读ChildRows时,我可以确定这是某种枚举(在其中的某个地方,继承树必须是接口IEnumerable)。

因此,您可以在System.Linq添加AsQueryable()并应用ChildRows

剩下的只是Linq(Select,Where,ToList())的一小部分。那就是它!

编辑: 第一部分应该由此解决:

Dim childList =
    Me.grdCNCFilesRad.ChildRows
        .AsQueryble()
        .Select(Function(row) row.Cells(e.Column.Index).Value)
        .Distinct()

答案 1 :(得分:0)

如果您遇到性能问题,则无需将ForEach转换为Linq

您现有的foreach代码看起来不错。

注意:在性能方面,Linqfor-each相比并不是更好。