【问题标题】:(Linq)Dictionaries: Except not returning a Dictionary(Linq)字典:除了不返回字典
【发布时间】:2013-07-16 21:09:22
【问题描述】:

我有两本词典:

Dim a As Dictionary(Of String, Type)
Dim b As Dictionary(Of String, Type)

我需要 a 中没有 b 中的内容,应该类似于:

a = a.Except(b)

但它给了我一个例外:

Unable to cast object of type 
    '<ExceptIterator>d__99`1[System.Collections.Generic.KeyValuePair`2[System.String,System.Type]]' 
to type 
    'System.Collections.Generic.Dictionary`2[System.String,System.Type]'

如果我使用匿名变量,一切正常,但我需要它是强类型的。

对我做错了什么有任何想法吗?

提前致谢!

p.s.:对于那个异常,我猜它必须与 keyValuPair 相关,但我还没有找到解决它的方法。

【问题讨论】:

    标签: .net vb.net winforms linq dictionary


    【解决方案1】:

    Except 返回IEnumerable(Of KeyValuePair(Of String, Type)) 是对的。你可以通过调用ToDictionary 扩展方法来解决这个问题:

    a = a.Except(b) _
         .ToDictionary(Function(x) x.Key, Function(x) x.Value)
    

    但这可能会更好,因为它不涉及创建新字典:

    For Each x in a.Intersect(b)
        a.Remove(x.Key)
    Next
    

    【讨论】:

    • 我正在尝试这样做,但由于某种原因,当我使用 x. 时,它不允许我使用 Key
    • @Luis 它绝对应该工作。为了确定,我自己测试了它。
    • 好吧,我关闭了 VS,重新打开它,进行了重建,然后......它可以工作......谢谢
    • 我不确定 VB.NET,但可能在这里 Collection 被修改异常?您无法删除正在修改的集合中的某些内容
    • @cleric 在这种情况下不会发生这种情况。你正在循环a.Intersect(b) 哪个actually creates a new Set&lt;T&gt; to enumerate。当然,您总是可以在末尾添加.ToList().ToArray() 更加小心。
    【解决方案2】:

    这应该可以解决它 - 在表达式末尾添加一个 ToList。

    a = a.Except(b).ToList

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-22
      • 2014-06-02
      • 2014-01-02
      • 1970-01-01
      相关资源
      最近更新 更多