vb.net - LINQ 除了使用自定义比较器

标签 vb.net linq iequalitycomparer except

如果 IEqualityComparer 基于结果集中单个字段的值排除某些结果,我尝试使用自定义实现对 LINQ 结果集使用“Except”方法。

所以,以简化的形式,我有......

'' Get collection of published sites...
Dim List1  = (From i In db.Sites _
              Where (i.StatusID = published) _
              Select i.SiteID, _
                     i.SiteName)

'' Find those with a pending site, but exclue all those whose SiteID is in List1...
Dim insComparer = New insCompare
Dim List2 = (From i In db.Sites _
             Where (i.StatusID = pending) _
             Select i.SiteID, _
                    i.SiteName).Except(List1, insComparer)

我的比较器如下...

Public Class insCompare
    Implements System.Collections.Generic.IEqualityComparer(Of Object)

    Public Function Equals1(ByVal x As Object, ByVal y As Object) As Boolean Implements System.Collections.Generic.IEqualityComparer(Of Object).Equals
        Return IIf(x.SiteID = y.SiteID, True, False)

    End Function

    Public Function GetHashCode1(ByVal x As Object) As Integer Implements System.Collections.Generic.IEqualityComparer(Of Object).GetHashCode
        Return x.SiteID.ToString.ToLower.GetHashCode()

    End Function

End Class

我在“.Except”行收到无效的转换异常,并显示消息“无法将类型为 '...insCompare' 的对象转换为类型为 'System.Collections.Generic.IEqualityComparer'”

谁能解释一下为什么会这样。

最佳答案

这里的问题是您实现了 IEqualityComparer(Of Object),但您的列表是 List(Of AT),其中 AT 是匿名类型,因此您无法实现 IEqualityComparer(Of AT)。

我认为你的选择是:

  1. 声明一个类/结构来保存 SideID/SiteName,并选择该类的实例,然后实现 IEqualityComparer(Of NewClass)。
  2. 使用后期绑定(bind)调用(即选项显式关闭,就像您现在所做的那样),并在调用 except 之前对两个列表进行 .Cast(Of Object)() 调用。

关于vb.net - LINQ 除了使用自定义比较器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1006614/

相关文章:

mysql - 如何设置用户只能编辑和访问特定的数据库表?

c# - 如何从 COM 客户端访问基于列表(Of T)的对象

c# - 当实例在多列上分组或分类时如何找到平均值?

c# - 按枚举名称排序查询结果

c# - LINQ Intersect、Union 中的集合优先级,使用 IEqualityComparer

c# - 在 C# 中对具有两个属性的对象实现 IEqualityComparer<T>

c# - Web 服务不返回当前 Windows 用户名

c# - 如何在 VB.Net 中声明 lambda 事件处理程序?

vb.net - 在 VB.net 中的赋值左侧使用 LINQ 查询

linq - 为 linq groupby 编写自定义比较器