【发布时间】: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 无关,它仅在内存中,即使生产用途中的集合包含更多的项目,所以这个问题可能更多的是关于可读性而不是性能......