首页 > 解决方案 > 循环遍历不同类型对象的组合列表

问题描述

我有两个清单。一个具有“Foo”类型,另一个具有“Bar”类型。

Foo 和 Bar 都恰好具有“a”的属性。

有没有办法循环遍历这两个列表并相互组合以检查属性 a 的值?

伪代码

for each item in FooList + BarList
    if item.a = "this is the value" then
        return True
    end if
next

我不想单独遍历列表,尽管我知道这会起作用。

我不希望原始列表因附加而被修改。

Linq 答案是可以接受的。


上下文是我正在搜索 DXF 文件中的所有文本。其中一些文本称为 MTEX​​TS,而另一些则简称为 TEXT。MTEXT只是一个具有更多特征的文本,但无论其他属性是什么,这两者显然都包含“值”的共同属性。


更新

根据接受的答案中的代码,我能够想出一个快速的内联方法。

for each item in new List(Of Object)().Concat(FooList).Concat(BarList)
    if item.a = "this is the value" then
        return True
    end if
next

标签: vb.net

解决方案


我相信这会引起许多人的愤怒,但这里有一种方法可以做到这一点。将列表转换为对象,然后将它们 Concat() 组合在一起,以便您可以枚举它们。现在使用 CallByName() 从它们那里获取“A”属性:

Public Class Form1

    Private FooList As New List(Of Foo)
    Private BarList As New List(Of Bar)

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        FooList.Add(New Foo() With {.A = "Bob"})
        FooList.Add(New Foo() With {.A = "Dora"})
        BarList.Add(New Bar() With {.A = "Pikachu"})
        BarList.Add(New Bar() With {.A = "Aang"})
        BarList.Add(New Bar() With {.A = "Joe"})
    End Sub

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        For Each O As Object In FooList.Cast(Of Object).Concat(BarList.Cast(Of Object))
            Dim A As String = CallByName(O, "A", CallType.Get)
            Debug.Print(A)
        Next
    End Sub

End Class

Public Class Foo

    Public Property A As String

End Class

Public Class Bar

    Public Property A As String

End Class

推荐阅读