【问题标题】:Linq - filter listLinq - 过滤器列表
【发布时间】:2018-09-26 08:11:22
【问题描述】:

我正在使用 sql server 数据库在 vb.net windows forms 应用程序中构建一个简单的搜索工具, 用户将输入一个唯一的 ID,并会看到显示状态的结果。

对象类:

            Public Class IStatus
                    Public Property Id As String
                    Public Property Status As String

                    Public Sub New(ByVal Id As String, ByVal Status As String)
                        Id = Id
                        Status = Status            
                    End Sub
            End Class

我正在做的是在 List(Of IStatus) 中填充数据库中的行 现在我想使用 linq 从数据表中过滤行,到目前为止我已经完成了以下操作:

            Public Function GetDS() As List(Of IStatus)
                    Dim sRows As New List(Of IStatus)
                    Dim dr As SqlDataReader = GetDataReader()
                    If dr.HasRows Then
                        Using dt As New DataTable
                            dt.Load(dr)
                            totRows = dt.Rows.Count
                            If (totRows > 1) Then
                                For Each drow As DataRow In dt.Rows
                                    Dim sRow As New IStatus(drow(0).ToString(), drow(1).ToString())
                                    sRows.Add(sRow)
                                Next

                                'Trying to filter the data with linq conditions here ... 
                                Dim uniqRows = sRows.Where(Function(p) p.Status = "Open" Or p.Status = "Closed" Or p.Status = "Unknown").ToList
                                sRows = uniqRows.ToList
                            Else
                                Dim sRow As New IStatus(dt.Rows(0)(0).ToString, dt.Rows(0)(1).ToString)
                                sRows.Add(sRow)
                            End If
                            Return sRows
                        End Using
                    End If
            End Function

我有以下对象的列表:

IStatus
-----------
Id
Status

以下是我希望实现的示例数据和过滤:

例如数据:

-----------------
Id           Status
-----------------
1            Open
1            Open
1            Closed

返回所有行,因为其中一个状态值不同。

Id           Status
-----------------
1            Open
1            Open
1            Open

只返回第一行,因为所有状态值都相同。

Id           Status
-----------------
1            Unknown
1            Open
1            Open

如果任一状态为未知,则返回未知行。

谢谢。

【问题讨论】:

  • 你的问题是什么?你试图解决这个问题是什么?我们不在这里做你的工作。除此之外:为什么 tga 还专门针对带有 C# 的 VB.NET 提出一个问题?
  • 为什么所有东西的 ID 都是 1,我很难理解这一点,也发布你的代码
  • 同时选择一种语言并从标签中删除您不使用的语言
  • 嗨,我是 linq 新手,也想在 c# 中学习相同的内容。所以我标记了 vb.net 和 c#
  • 这看起来像是你的家庭作业。这可能还不错,只是我们在这里不这样做。我们帮助有具体问题的人他们有同时解决他们的问题。所以试一试,如果它没有按预期工作,请向我们提供minimal reproducible example 和清晰的问题描述。如果您不知道如何开始,那么您需要找到一本好书或教程,这种帮助太广泛了,无法在此处发布。

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


【解决方案1】:

你可以使用 findall 函数来过滤一个通用列表

Public Class IStatus
    Public Property Id As String
    Public Property Status As String

    Public Sub New(ByVal Id_ As String, ByVal Status_ As String)
        Id = Id_
        Status = Status_
    End Sub
End Class
Function Createlist() As List(Of IStatus)
    Dim L1 = New List(Of IStatus)()
    L1.Add(New IStatus("1", "open"))
    L1.Add(New IStatus("1", "open"))
    L1.Add(New IStatus("1", "closed"))
    L1.Add(New IStatus("1", "closed"))
    L1.Add(New IStatus("1", "closed"))
    L1.Add(New IStatus("2", "open"))
    L1.Add(New IStatus("2", "open"))
    L1.Add(New IStatus("2", "closed"))
    L1.Add(New IStatus("2", "closed"))
    L1.Add(New IStatus("2", "closed"))
    Return L1
End Function
Sub main()
    Dim l1 = Createlist().FindAll(Function(x As IStatus) x.Id = "1")
    For Each ii In l1
        With ii
            Console.WriteLine(.Id & "- " & .Status)
        End With

    Next
    Stop
End Sub

【讨论】:

    猜你喜欢
    • 2021-10-29
    • 1970-01-01
    • 1970-01-01
    • 2011-07-02
    • 2016-12-09
    • 2019-07-20
    • 1970-01-01
    相关资源
    最近更新 更多