2009-07-09 8 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}) 

は、私は上記のコードで強調表示するいくつかの方法があった希望が、私はコンパイルエラーが出ます:「.Contains(newで{l1.id、L1上の

Value of type '<anonymous type> (line n)' cannot be converted to '<anonymous type> (line n)'. 

。タイムスタンプ}) "

匿名の型が何らかの形で異なっていると思われますが、どちらのリストでもidとtimestampの列は同じです。彼らも同じ順序です。両者の違いは何ですか?

[編集] 2009年7月10日午前16時28 EST]

Iは、ユーザメタナイト(newで{キー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} 

編集:

これはあなたのために動作しない理由を私は知らないが、私は念のために全体のコードを投稿します。この、あなたのクラスに等しいとGetHashCodeメソッドをオーバーライドする必要があります作業、およびインタフェース(Tの)IEquatableを実装するための

Dim dsNewFiles = list1.Except(list2) 

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

別のオプションは、単純に次の操作を行うことです。非常に良い例がon MSDN(下部にあります)です。

IDとタイムスパンがクラス内で等価でない場合、カスタムIEqualityComparer(Of T)を第2引数として使用できます。

+0

@ Meta-Knight:洞察に感謝します。コンパイルエラーがなくなりました。しかし、コードはまだ期待どおりに動作しません。上記の編集をご覧ください。 – Daniel

+0

詳細と別の方法で編集しました。 –

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) 

これは、完全なエアコード、btwです。

また、あなたの例では、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

Ah。そうですか。私がそこでやろうとしていることをどのようにするか考えていますか? – Daniel

+0

私はあなたの編集を参照してください...私はそれが動作するとは思わない、少なくともそれはそうではないようです。上記の場合と同じですか?両方の新しい "Withs"は、異なる署名のオブジェクトを作成しますか? – Daniel

+0

@hypoxideどちらのシグネチャも私には見えません。私が見ていないものをミスタイプしない限り。それを試して、あなたが得るものを参照して、私はVSの私の前に私は試してみる必要はありません。 – Joseph

関連する問題