【问题标题】:How to filter a list of generic objects如何过滤通用对象列表
【发布时间】:2019-04-07 14:53:18
【问题描述】:

我找到了实现扩展 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

问题在于,下面的示例像过滤器一样接收子句中的字符串 where 但编译时出现错误,因为它等待函数 我不知道如何解决这个问题

抱歉,如果您不太了解。我英语不好

【问题讨论】:

  • Where 子句需要一个 Function(item as T)(其中 T 是 _originalData 中的项目的类型),它返回一个 Boolean 结果。您将需要可以解析_filter 并将其表示的逻辑处理为Boolean 结果的函数。这不是一件容易的事。一种更简单的方法(但仍然需要大量工作)是向用户提供一个表单,该表单允许他们选择在T 上定义的属性,一个要应用的比较运算符,并输入一个值来比较该属性。这样做会限制表达式评估代码中需要考虑的可能性。
  • 继续.. 如果您熟悉 MS Excel,请查看他们如何通过显示带有下拉菜单的对话框来定义自定义自动筛选。

标签: vb.net list linq-to-objects


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    在一些推荐这个的帖子中有一个答案。

    您可以使用动态 Linq:

    Dim filter As String = "property1>10 and property2 like 'anystring' or property3

    暗淡的结果 = Elements.Where(filter)。

    但我不知道如何使用 dinamic linq

    【讨论】:

      猜你喜欢
      • 2017-06-14
      • 2022-01-16
      • 2015-03-24
      • 2021-09-14
      • 2021-09-26
      • 2013-12-21
      • 1970-01-01
      • 1970-01-01
      • 2016-03-02
      相关资源
      最近更新 更多