LINQ中,VB - 匿名类型不能转换为匿名类型
问题描述:
我一个LINQ noobie,也许有人可以点我在正确的方向。这里有什么问题?这些匿名类型似乎具有相同的签名。LINQ中,VB - 匿名类型不能转换为匿名类型
'*** Get all of the new list items'
Dim dsNewFiles = From l1 In list1 _
Where Not (From l2 In list2 _
Select l2.id, l2.timestamp).Contains(New With {l1.id, l1.timestamp})
我希望有一些方法在上面的代码突出,但我得到的编译错误:
Value of type '<anonymous type> (line n)' cannot be converted to '<anonymous type> (line n)'.
的”。载有(新增功能{l1.id,L1。时间戳})“
我假设它认为匿名类型在某些方面是不同的,但id和timestamp列在任一列表中都是相同的。他们也是以相同的顺序。两者之间还有什么不同?
[编辑7/10/2009 16时28 EST]
我试图从用户的元奈特(新泽西借助{密钥l1.id,l1.timestamp}),并将其建议的代码的固定编译错误。然而,当我用列表1和列表2跑代码如下:
List1 List2
id timestamp id timestamp
-- ---------- -- ----------
01 2009-07-10 00:00:00 01 2009-07-10 00:00:00
结果是:
dsNewFiles
id timestamp
-- ----------
01 2009-07-10 00:00:00
它应该是一个空列表。
答
你的代码的最后一部分只是更改为:
New With {Key l1.id, Key l1.timestamp}
我测试的代码和它的作品。
编辑:
我不知道为什么,这并不为你工作,我会后整个代码只是要确定。
Dim dsNewFiles = From l1 In list1 _
Where Not (From l2 In list2 _
Select l2.ID, l2.TimeStamp).Contains(New With {Key l1.ID, Key l1.TimeStamp})
另一种选择是简单地做到以下几点:
Dim dsNewFiles = list1.Except(list2)
对于这个工作,你的类必须重载Equals和GetHashCode和落实IEquatable(Of T)已界面。有一个很好的例子on MSDN(底部)。
如果ID和时间跨度并不代表你的类平等,你可以使用自定义的IEqualityComparer(Of T)作为第二个参数。
答
当您生成匿名类型,它们将作为单独的类型生成,如果他们不具有相同的名称,并在相同的确切顺序指定它们的属性。所以,你的例子是,如果我这样做是相同的:
Class A
BeginClass
Begin ID as Int Begin ... End
Stuff as String Begin ... End
EndClass
Class B
BeginClass
Begin Stuff as String Begin ... End
ID as Int Begin ... End
EndClass
From a In someListofAs
Where Not (From b In someListofBs Select b).Contains(a)
这就是完整的空气代码,顺便说一句。
而且,在你的例子你的LINQ的一个部分是一个匿名类型,另一种是没有。这可能是你的问题。
试试这个:
From l1 In list1 _
Where Not (From l2 In list2 _
Select New With { ID = l2.id, Timestamp = l2.timestamp}).Contains(
New With { ID = l1.id, Timestamp = l1.timestamp})
啊。我懂了。任何想法如何做我想在那里做什么? – Daniel 2009-07-09 16:49:36
我在那里看到你的编辑...我不认为这会起作用,至少它似乎不是。这与上面的情况不一样吗?新的“Withs”会创建不同签名的对象吗? – Daniel 2009-07-09 17:05:25