在VB.net中对相同类型的结构对象执行并集

在VB.net中对相同类型的结构对象执行并集,vb.net,visual-studio-2010,linq,Vb.net,Visual Studio 2010,Linq,我有两个相同类型的结构对象,如果其中一个iQueryTables中可能没有数据成员,我想知道是否有方法对它们执行并集以生成一个结构对象。我应该如何处理可能出现的空结果,无论是Qy1还是Qy2,并且在不事先知道结果的情况下仍然能够合并它们。提前谢谢 Structure MyStrut public DMem1 As String public DMem2 As String End Structure Dim Qy1 As IQueryable(Of Mystrut) D

我有两个相同类型的结构对象,如果其中一个iQueryTables中可能没有数据成员,我想知道是否有方法对它们执行并集以生成一个结构对象。我应该如何处理可能出现的空结果,无论是Qy1还是Qy2,并且在不事先知道结果的情况下仍然能够合并它们。提前谢谢

Structure MyStrut 
    public DMem1 As String 
    public DMem2 As String 
End Structure

Dim Qy1 As IQueryable(Of Mystrut) 
Dim Qy2 As IQueryable(Of Mystrut) 
Dim QyUnion As IQueryable(Of Mystrut)

Qy1 = from q1 In query1 select new MyStrut{.DMem1 = Nothing, .DMem2=q1.txtField2}

Qy2 = from q2 In query2 select new MyStrut{.DMem1 = q2.txtField1, .DMem2=Nothing}

QyUnion = (From x In Qy1 select x).Concat(From y In Qy2 select y)

我认为你在这里是靠你自己的——如果我理解你的要求,你的要求真的无法自动预测,因此我认为你需要编写一个方法,如:

Public Function Combine(input As IEnumerable(Of MyStruct)) As MyStruct
    Dim result As New MyStruct()
    For Each s As MyStruct In input
        If (result.DMem1 Is Nothing AndAlso s.DMem1 IsNot Nothing) Then
            result.DMem1 = s.DMem1
        End If
        If (result.DMem2 Is Nothing AndAlso s.DMem2 IsNot Nothing) Then
            result.DMem2 = s.DMem2
        End If
    Next
    Return result
End Function

你应该能够通过简单的方法让他们结合起来

QyUnion = Qy1.Union(Qy2)
这里不需要“从”和“选择”,特别是当您仅选择完整对象时。事实上,与C不同,VB不需要任何结尾选择。因此,以下内容也完全有效:

QyUnion = from a in Qy1.
          Union(from b in Qy2)

尽管如此,我不知道当第一个例子非常好的时候,为什么要在这里付出额外的努力。

你试过了吗。工会声明?谢谢你的快速回复。我认为datamembers可能被设置为数据成员各自数据类型的默认值。因此,Mystruct的union'ed iQueryable将具有Row0 Dmem1=Nothing;Dmem2=txtField2,第1行Dmem1=txtField1;Dmem2=txtField2。出于所有的目的,我可以通过将Nothing硬编码为String来默认它们。清空我的问题是,即使我这样做,我的新QyUnion也没有任何行,知道为什么吗?我想我并不完全理解你想要什么。我认为您希望将项目集合合并为一个,尽可能多地填充属性。您所描述的是将两个集合合并为一个集合,同时合并各个对象。也许你可以通过提供一个现实世界的例子来扩展你的问题,提出解决方案可能会更容易。谢谢Jim的提示