2009-07-09 227 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