【问题标题】:Best way of filtering a generic collection when using lambda expressions?使用 lambda 表达式时过滤泛型集合的最佳方法?
【发布时间】:2023-03-24 23:18:02
【问题描述】:

当使用 lambda 表达式时,有没有更好的方法来过滤 .NET 中的泛型集合?在使用 lambda 表达式或 LINQ 时,应注意可读性但避免不必要的代码并遵循最佳实践。

这里是一些用于过滤包含 Pet 类型对象的通用集合的代码,我们希望获得所有 PetType = "Dog" 对象的最小年龄。

Module Module1

    Public Class Pet
        Public Name As String
        Public Age As Integer
        Public PetType As String
    End Class

    Sub Main()
        ' Create an array of Pet objects. 
        Dim pets As New List(Of Pet) From {
                                            New Pet With {.Name = "Barley", .Age = 8, .PetType = "Dog"}, _
                                            New Pet With {.Name = "Boots", .Age = 4, .PetType = "Dog"}, _
                                            New Pet With {.Name = "Jacky", .Age = 1, .PetType = "Cat"}, _
                                            New Pet With {.Name = "Whiskers", .Age = 2, .PetType = "Dog"}
                                        }

        ' Find the youngest dog by passing a  
        ' lambda expression to the Min() method. 
        Dim min As Integer = pets.Where(Function(pet) pet.PetType = "Dog").Min(Function(pet) pet.Age)

        ' Display the result.
        Console.WriteLine("The youngest dog is age " & min)

        ' This code produces the following output: 
        ' 
        ' The youngest dog is age 2
        Console.ReadLine()
    End Sub

End Module

【问题讨论】:

  • 我不确定你是否能比在实践中使用对方法Where 的单一调用更好。你有没有什么特别的事情你认为可能效率低下?
  • 这纯粹是从内存的角度还是从数据库查询的角度?因为它们是两个完全不同的挑战,而且,这是否与我们正在谈论的记录数量有关?如果是这样,对你所拥有的任何改进都将是微不足道的(微秒,如果有的话)。如果它纯粹是在内存中,那么它所运行的机器的规格也是一个促成因素……没有足够的上下文来正确回答这个问题,真的。
  • @James:我在上面的代码中没有看到数据库...假设没有。
  • @Neolisk 然而,我知道,人们通常会将 LINQ to Objects 与 LINQ to EF 混淆——我只是想澄清一下。 OP 可能会将这个小示例用于演示目的。
  • 对不起,伙计们,这与数据库/EF 无关,它仅在内存中,即使生产用途中的集合包含更多的项目,所以这个问题可能更多的是关于可读性而不是性能......

标签: .net vb.net lambda


【解决方案1】:

如果您想在 VB 中使其更惯用(并且稍微简洁一些),您可以使用Aggregate 子句,如下所示:

Dim minAge = Aggregate p In pets Where p.PetType = "Dog" Into Min(p.Age)

【讨论】:

    【解决方案2】:

    效率不高,但稍微短一些,希望更易读:

    Dim min As Integer =
      (From pet In pets Where pet.PetType = "Dog" Select pet.Age).Min
    

    我只是将您的内联 LINQ 转换为查询样式。

    【讨论】:

    • 很好,内联 LINQ 确实会提高代码的可读性!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多