Преобразовать For-Each в запрос LINQ для добавления элементов в список и проверить, что список wehter уже содержит элемент

#vb.net #winforms #linq

#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?

Комментарии:

1. Вы пробовали что-нибудь до сих пор? Было бы лучше, если бы вы могли сначала показать свою работу, чтобы сообщество могло помочь.

Ответ №1:

Я не знаю, какой у вашей переменной grdCNCFilesRad тип, но я предполагаю, что это нет.Тип NET. Но когда я читаю ChildRows , я могу быть уверен, что это какое-то перечисление (где-то в дереве наследования должен быть интерфейс IEnumerable ).

Таким образом, вы можете включить System.Linq и применить a AsQueryable() по своему ChildRows усмотрению.

Остальное — это всего лишь небольшая часть Linq (Select, Where, ToList()). Вот и все!

Редактировать: первая часть должна быть решена следующим образом:

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

Комментарии:

1. Затемните newPopup как новый RadListFilterPopup (например, столбец) для каждого элемента как System. Коллекции. ArrayList в ePopup.MenuTreeElement. DistinctListValues . Значения, если не дочерний список. Содержит (элемент (0)) Затем newPopup.MenuTreeElement . DistinctListValues . Удалить (элемент (0). toString()) Завершается, если следующий

Ответ №2:

Нет необходимости в преобразовании ForEach , Linq если у вас проблемы с производительностью.

Ваш существующий foreach код выглядит хорошо.

Примечание: не думайте Linq , что это лучше по сравнению for-each с производительностью.