【问题标题】:.Except<T> is throwing an Exception.Except<T> 正在抛出异常
【发布时间】:2010-03-21 00:31:31
【问题描述】:

我有以下代码:

Public Shared Function GetAvailableManufacturers() As List(Of Manufacturer)
    'first get all the live orders and extract their mfrs'
    Dim sos As List(Of OrderForm) = GetFormsByStatus(StockStatus.Building)
    Dim unavailableMfrs As New List(Of Manufacturer)
    For Each so As StockingOrder In sos
        unavailableMfrs.Add(so.Source)
    Next

    'then remove all mfrs with an open SO from a list of all mfrs'
    Dim allMfrs As List(Of Manufacturer) = Manufacturer.GetManufacturers
    Return allMfrs.Except(unavailableMfrs) <----- error here
End Function

解释上面的作用:

  • GetFormsByStatus() 不言自明
  • GetManufacturers() 返回数据库中所有制造商的列表

我获取可用制造商的想法是在我的开放表单中获取所有制造商的列表,然后获取所有制造商的列表并排除第一个列表中的所有制造商,如下所示(伪):

List A: {1,2,3,4,5,6,7,8,9,10}
List B: {5,7,10}
Result: {1,2,3,4,6,8,9}

我已经根据this article设置了我的Manufacturer类,以便可以比较,但我仍然收到此错误:

无法将“&lt;ExceptIterator&gt;d__92'1[csCore.Manufacturer]'”类型的对象转换为“System.Collections.Generic.List'1[csCore.Manufacturer]”类型。

我一开始以为是因为在测试期间GetFormsByStatus() 返回 0 个结果可能会导致问题,但如果提供的列表有 0 个项目,Except() 将不起作用是没有意义的。谁能发现我做错了什么?

非常感谢!

【问题讨论】:

    标签: asp.net vb.net linq


    【解决方案1】:

    该函数需要 List(Of Manufacturer) 返回类型,而不是 IEnumerable(Of Manufacturer),因此将 .ToList() 添加到返回值应该可以解决它:

    Return allMfrs.Except(unavailableMfrs).ToList()
    

    【讨论】:

    • 没错,但我真的认为相反的方法更好:让方法返回一个IEnumerable(of Manufacturer),让调用者决定是否花费额外的资源将其具体化到一个列表中。事实上,any 方法很少会真正返回可变集合。
    • @aaronaught - 真相。这个答案仍然是该问题的正确答案,但您是绝对正确的。我的实际实现反映了这一点。
    【解决方案2】:

    您的函数被声明为返回 List(Of Manufacturer),但您的 Return 语句仅返回一个 IEnumerable(Of Manufacturer)。将return语句更改为:

    Return allMfrs.Except(unavailableMfrs).ToList()
    

    如果你打开 Option Strict On,我相信 VB 会在编译时捕捉到这种错误,而不是在运行时崩溃。

    【讨论】:

      【解决方案3】:

      问题是Enumerable.Except返回IEnumerable&lt;T&gt;,但是你的返回类型是List(Of T)

      将最后一行更改为:

      Return allMfrs.Except(unavailableMfrs).ToList()
      

      【讨论】:

        猜你喜欢
        • 2014-12-10
        • 1970-01-01
        • 2023-03-05
        • 1970-01-01
        • 1970-01-01
        • 2013-05-24
        • 2012-01-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多