【问题标题】:extract list of string from list of custom class从自定义类列表中提取字符串列表
【发布时间】:2019-02-08 21:10:25
【问题描述】:

我有一个列表(自定义类)

我想通过 linq 从中提取所有“名称”字符串的列表

我知道如何处理循环,但我需要使用线性、简短的 linq 指令来获得它。

我已经检查了这个帮助 C# Extract list of fields from list of class

但是我在 linq 正确的语法上有问题

特别是因为我想提取一个新列表(字符串)

Class Student
    Sub New(ByVal NewName As String, ByVal NewAge As Integer)
        Name = NewName
        Age = NewAge
    End Sub

    Public Name As String
    Public Age As Integer
End Class

Public Sub Main
    Dim ClassRoom as New List(Of Student) From {New Student("Foo",33), New Student("Foo2",33), New Student("Foo3",22)}
    Dim OneStudent as Student = ClassRoom(0)
    Dim AllStudentsNames As New List(Of String) From {ClassRoom.Select(Function(x) x.Name <> OneStudent.Name).ToList}
End Sub

但是有些不对劲……

有什么帮助吗?

附:由于 c# 接近 vb.Net,因此也欢迎 c# 帮助。

【问题讨论】:

    标签: vb.net linq


    【解决方案1】:

    首先,您不需要创建一个由 LINQ 方法返回的新列表 From。此时它已经在一个新列表中,因此您可以将AllStudentsNames 直接设置为等于ToList 方法返回的值。

    其次,您没有选择名称。您正在选择相等测试的结果以查看名称是否不同。换句话说,当您说Select(Function(x) x.Name &lt;&gt; OneStudent.Name) 时,它会返回一个布尔值列表,如果名称不同,则返回 true,如果名称相同,则返回 false。那不是你想要的。您需要名称列表,因此您需要选择名称。

    第三,如果您需要过滤列表使其只返回名称不同的列表,那么您需要添加对Where 方法的调用。

    Dim AllStudentsNames As List(Of String) = ClassRoom.
        Where(Function(x) x.Name <> OneStudent.Name).
        Select(Function(x) x.Name).
        ToList()
    

    【讨论】:

    • 非常感谢。也为了详细解释。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-26
    • 2020-10-06
    • 1970-01-01
    • 2018-12-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多