Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我如何消除'=';VB.NET中lambda函数中的符号_Vb.net - Fatal编程技术网

我如何消除'=';VB.NET中lambda函数中的符号

我如何消除'=';VB.NET中lambda函数中的符号,vb.net,Vb.net,我使用Dapper从数据库中查询项目的平面列表,并将其放入POCO类中,如下所示: Public Class Node Public Property Name As String Public Property ParentNodeName As String Public Property Children As IEnumerable(Of Node) End Class 我试图使用公认的答案,以便从平面列表中创建一个树 唯一需要注意的是,我使用的是VB.NET

我使用Dapper从数据库中查询项目的平面列表,并将其放入POCO类中,如下所示:

Public Class Node
    Public Property Name As String
    Public Property ParentNodeName As String
    Public Property Children As IEnumerable(Of Node)
End Class
我试图使用公认的答案,以便从平面列表中创建一个树

唯一需要注意的是,我使用的是VB.NET

我尝试了C#解决方案的简单端口:

nodes.ForEach(Function(n) n.Children = nodes.Where(Function(ch) ch.ParentNodeName = n.Name).ToList)
但它不会编译时出错

Error   BC30452 Operator '=' is not defined for types 'List(Of Node)' and 'List(Of Node)'.
=
符号被解释为相等运算符,而我的意思是使用赋值运算符

我已将C#代码粘贴到telerik转换器中,转换后的代码为:

Private Shared Function BuildTree(ByVal items As List(Of Category)) As IEnumerable(Of Category)
    items.ForEach(Function(i) CSharpImpl.__Assign(i.Categories, items.Where(Function(ch) ch.ParentId = i.Id).ToList()))
    Return items.Where(Function(i) i.ParentId Is Nothing).ToList()
End Function

Private Class CSharpImpl
    <Obsolete("Please refactor calling code to use normal Visual Basic assignment")>
    Shared Function __Assign(Of T)(ByRef target As T, value As T) As T
        target = value
        Return value
    End Function
End Class
私有共享函数BuildTree(ByVal项作为列表(属于类别))作为IEnumerable(属于类别)
items.ForEach(函数(i)csharpumpl.\u赋值(i.Categories,items.Where(函数(ch)ch.ParentId=i.Id).ToList())
Return items.Where(Function(i)i.ParentId为Nothing).ToList()
端函数
私有类CSharpImpl
共享函数uu分配(Of T)(ByRef目标为T,值为T)为T
目标=价值
返回值
端函数
末级
它使用了一个helper类来解决这个问题,但建议进行重构来避免这个问题

因此,问题是:

  • 在VB.NET中,是否有一种通用的方法来消除
    相等=
    赋值=
    之间的歧义,而无需求助于助手类和特定函数来赋值

  • 在这种情况下,有没有一个简单的重构方法可以用来解决这个问题?


    • 这是因为VB.Net在函数和子例程之间的区别

      而不是

      nodes.ForEach(Function(n) n.Children = nodes.Where(Function(ch) ch.ParentNodeName = n.Name).ToList)
      
      使用

      使用
      函数
      时,lambda表达式应返回一个值;在您的例子中,它看起来想要返回一个布尔值


      但是如果要使用不返回任何内容的lambda表达式(在您的情况下,您需要赋值),则必须使用
      Sub

      ,这是因为VB.Net在函数和子例程之间存在区别

      而不是

      nodes.ForEach(Function(n) n.Children = nodes.Where(Function(ch) ch.ParentNodeName = n.Name).ToList)
      
      使用

      使用
      函数
      时,lambda表达式应返回一个值;在您的例子中,它看起来想要返回一个布尔值


      但是如果要使用不返回任何内容的lambda表达式(在本例中,您需要赋值),则必须使用
      Sub

      使用
      返回ch.ParentNodeName=n.Name
      来解决歧义。使用
      返回ch.ParentNodeName=n.Name
      来解决歧义。这部分是因为在VB中,赋值是一个语句,而不是一个表达式(与C语言不同)。因此,如果在表达式上下文中使用
      =
      ,它必然会被解释为相等比较运算符,因为它不能是赋值。这部分是因为在VB中,赋值是语句,而不是表达式(与C语言不同)。因此,如果在表达式上下文中使用
      =
      ,它必然会被解释为相等比较运算符,因为它不能是赋值。