2009-07-09 131 views
3

我一个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 

它应该是一个空列表。

回答

1

你的代码的最后一部分只是更改为:

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)作为第二个参数。

1

当您生成匿名类型,它们将作为单独的类型生成,如果他们不具有相同的名称,并在相同的确切顺序指定它们的属性。所以,你的例子是,如果我这样做是相同的:

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}) 
+0

啊。我懂了。任何想法如何做我想在那里做什么? – Daniel 2009-07-09 16:49:36

+0

我在那里看到你的编辑...我不认为这会起作用,至少它似乎不是。这与上面的情况不一样吗?新的“Withs”会创建不同签名的对象吗? – Daniel 2009-07-09 17:05:25