如何筛选通用对象列表

问题描述 投票:0回答:2

我找到了实现扩展BindingList的SortableBindingList的代码,理论上它让排序和过滤通用对象列表。它完美地排序列表但我无法过滤。

过滤器代码如下

       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

问题是,以下示例在子句中接收像过滤器一样的字符串,但是编译因为等待函数而导致错误,我不知道如何解决这个问题

对不起,如果你不太了解。我不会说英语

vb.net list linq-to-objects
2个回答
2
投票

你需要传递一个谓词。我希望这个例子能指导你。

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
投票

有些帖子中有一个答案可以推荐这个。

您可以使用Dynamic Linq:

Dim filter As String =“property1> 10 and property2 like'anystring'或property3 <= 25”。

昏暗的结果= Elements.Where(过滤器)。

但我不知道如何使用动态linq

© www.soinside.com 2019 - 2024. All rights reserved.