Как отфильтровать список универсальных объектов - PullRequest
0 голосов
/ 07 апреля 2019

Я нашел код для реализации SortableBindingList, который расширяет BindingList и теоретически позволяет сортировать и фильтровать список универсальных объектов.Он отлично работает, сортируя список, но я не могу получить фильтрацию.

Код фильтра выглядит следующим образом

       Protected Sub UpdateFilter()
        _isSorted = False 'remove sort.
        Try
            'We filter on the entire collection
            Dim filtered = _originalData.AsQueryable()

            If Not String.IsNullOrEmpty(_filter) Then filtered = filtered.Where(_filter)

            Dim filteredResult = filtered.ToList()
            Items.Clear()

            If filteredResult IsNot Nothing AndAlso filteredResult.Count > 0 Then
                For Each tItem As T In filtered
                    Items.Add(tItem)
                Next
            End If
        Catch
            'Reset the list
            Items.Clear()
            For Each tItem As T In _originalData
                Items.Add(tItem)
            Next

            'Rethrow the error
            Throw
        Finally
            OnListChanged(New ListChangedEventArgs(ListChangedType.Reset, -1))
        End Try
    End Sub

Проблема заключается в том, что следующий пример получает как фильтр строку в предложениигде, но компиляция выдает ошибку, так как она ожидает функцию, я не знаю, как решить эту проблему

Извините, если вы не понимаете, хорошо.Я плохо говорю по-английски

Ответы [ 2 ]

2 голосов
/ 07 апреля 2019

Вам нужно передать предикат. Я надеюсь, что этот пример поможет вам.

Private Function AddFilter(list As List(Of String), filter As Func(Of String, Integer, Boolean)) As List(Of String)
    Dim l As IEnumerable(Of String) = Nothing
    If Not IsNothing(filter) Then
        l = list.Where(filter)
    End If
    Return l.ToList
End Function

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Dim A As New List(Of String) From {"Mathew", "Mark", "Luke", "John"}
    Dim predicate As Func(Of String, Integer, Boolean) = Function(str, index) str.StartsWith("M")
    Dim FilteredList = AddFilter(A, predicate)
    For Each s As String In FilteredList
        Debug.Print(s)
    Next
End Sub
0 голосов
/ 07 апреля 2019

В некоторых постах есть ответ, который рекомендует это.

Вы можете использовать Dynamic Linq:

Dim filter As String = "property1> 10 и property2 как 'anystring' или property3 <= 25". </p>

Тусклые результаты = Elements.Where (фильтр).

Но я не знаю, как использовать динамический linq

...