【问题标题】:Translate C# Linq to VB将 C# Linq 转换为 VB
【发布时间】:2012-10-10 15:02:06
【问题描述】:

我可以使用一些帮助将这行 C# 代码转换为 VB。我对 Linq 很陌生,语法有问题...

var rows = GridView1.Rows.Cast<GridViewRow>().Where(a => a != row).ToList();

我尝试了许多在线转换工具,但都没有成功。

更新: 这是完整的代码块......

protected void MoveGridViewRows(object sender, EventArgs e)  {      
    Button btnUp = (Button)sender;      
    GridViewRow row = (GridViewRow)btnUp.NamingContainer;      
    // Get all items except the one selected      
    var rows = GridView1.Rows.Cast<GridViewRow>().Where(a => a != row).ToList();      
    switch (btnUp.CommandName)      
    {          
         case "Up":              
         //If First Item, insert at end (rotating positions)              
              if (row.RowIndex.Equals(0))
                  rows.Add(row);              
              else                 
                  rows.Insert(row.RowIndex - 1, row);              
                  break;          
         case "Down":              
         //If Last Item, insert at beginning (rotating positions)              
              if (row.RowIndex.Equals(GridView1.Rows.Count - 1))                  
                  rows.Insert(0, row);              
              else                 
                  rows.Insert(row.RowIndex + 1, row);              
                  break;      
         }      
         GridView1.DataSource = rows.Select(a => new     
         {          
              FirstName = ((TextBox)a.FindControl("txtFirstName")).Text,          
              LastName = ((TextBox)a.FindControl("txtLastName")).Text,      
         }).ToList();      
         GridView1.DataBind();  
} 

VS在编译时的具体错误是....

错误 11 重载解析失败,因为无法使用以下参数调用可访问的“Where”: 扩展方法 'Public Function Where(谓词 As System.Func(Of System.Web.UI.WebControls.GridViewRow, Integer, Boolean)) As System.Collections.Generic.IEnumerable(Of System.Web.UI.WebControls.GridViewRow)'在“System.Linq.Enumerable”中定义:嵌套函数与委托“System.Func(Of System.Web.UI.WebControls.GridViewRow, Integer, Boolean)”的签名不同。 扩展方法 'Public Function Where(predicate As System.Func(Of System.Web.UI.WebControls.GridViewRow, Boolean)) As System.Collections.Generic.IEnumerable(Of System.Web.UI.WebControls.GridViewRow)' 定义在“System.Linq.Enumerable”:未为“System.Web.UI.WebControls.GridViewRow”和“System.Web.UI.WebControls.GridViewRow”类型定义运算符“”。

还有……

错误 12 未声明名称“a”。 C:\Users\Documents\Visual Studio 2008\WebSites\vv_home\roeMgr.aspx.vb 51 46 C:\

这是目前为止的 VB 代码.....

    Protected Sub MoveGridViewRows(ByVal sender As Object, ByVal e As EventArgs)


    Dim btnUp As Button = DirectCast(sender, Button)
    Dim row As GridViewRow = DirectCast(btnUp.NamingContainer, GridViewRow)
    ' Get all items except the one selected      
    Dim rows = GridView1.Rows.Cast(Of GridViewRow)().Where(Function(a) a IsNot row).ToList()


    Select Case btnUp.CommandName
        Case "Up"
            'If First Item, insert at end (rotating positions)              
            If row.RowIndex.Equals(0) Then
                rows.Add(row)
            Else
                rows.Insert(row.RowIndex - 1, row)
            End If
            Exit Select
        Case "Down"
            'If Last Item, insert at beginning (rotating positions)              
            If row.RowIndex.Equals(GridView1.Rows.Count - 1) Then
                rows.Insert(0, row)
            Else
                rows.Insert(row.RowIndex + 1, row)
            End If
            Exit Select
    End Select
    GridView1.DataSource = rows.[Select](a >= New With { _
     .FirstName = DirectCast(a.FindControl("txtFirstName"), TextBox).Text, _
     .LastName = DirectCast(a.FindControl("txtLastName"), TextBox).Text _
    }).ToList()
    GridView1.DataBind()


End Sub

谢谢,

【问题讨论】:

  • 在线转换工具产生了什么?它们导致了哪些错误?
  • 您的编辑仍然没有解决@Servy 的问题——我不确定完整的代码块有什么帮助。话虽如此,我会更新我的答案以转换整个事情。
  • 在线工具将此报告为 VB..Dim rows = GridView1.Rows.Cast(Of GridViewRow)().Where(Function(a) a row).ToList().. .............但是在 VS 编辑器中代码失败,如下所示。

标签: c# vb.net linq


【解决方案1】:
Dim rows = GridView1.Rows.Cast(Of GridViewRow)().Where(Function(a) a IsNot row).ToList()

对于其他,应该是

GridView1.DataSource = rows.Select(Function(a) New With {_         
              .FirstName = CType(a.FindControl("txtFirstName"), TextBox).Text,_
              .LastName = CType(a.FindControl("txtLastName"), TextBox).Text_      
         }).ToList()

【讨论】:

  • 是的,我只是注意到在比较我们其他相同的答案时。 ;-)
  • 更新了完整 C# 代码块的帖子。问题是两行 LINQ
【解决方案2】:

我会说:

dim rows = GridView1.Rows.Cast(of GridViewRow)().Where(Function(a) a <> row).ToList()

但我无法对此进行测试。

【讨论】:

    【解决方案3】:
    Dim rows = GridView1.Rows.Cast(Of GridViewRow)().Where(Function(a) a <> row).ToList()
    

    【讨论】:

    • 我在看到 Chris 进行更正之前发布了这个 - Chris 的答案是正确的(分号除外)。
    • 您对 Bobson 帖子的编辑修复了第一个错误。我仍然在这一行收到“名称 a 未声明”错误......GridView1.DataSource = rows.[Select](a >= New With
    • Bobson 对该语句的转换对我来说看起来不错 - 除了您可以简单地使用“Select”而不是“[Select]”(VB 知道在这种情况下不使用 'Select' 作为关键字)。
    • 谢谢,正是这部分修复了它——“a row”应该是“a IsNot row”。你能告诉我有一种方法可以遍历最后一个 Datasource 行上的 gridview.... GridView1.DataSource = rows.[Select](Function(a) New With { _ Key .FirstName = DirectCast(a.FindControl( "txtFirstName"), TextBox).Text, _ Key .LastName = DirectCast(a.FindControl("txtLastName"), TextBox).Text _ }).ToList() .....这显然是为了例子而写的,实际上,我的网格有更多的列。我想遍历它们以重建数据源。如果您愿意,可以发布新主题
    【解决方案4】:

    根据this converter,是

     Dim rows = GridView1.Rows.Cast(Of GridViewRow)().Where(Function(a) a <> row).ToList()
    

    这对我来说是正确的。


    既然你发布了完整的代码块,下面是转换整个东西的结果:

    Protected Sub MoveGridViewRows(sender As Object, e As EventArgs)
        Dim btnUp As Button = DirectCast(sender, Button)
        Dim row As GridViewRow = DirectCast(btnUp.NamingContainer, GridViewRow)
        ' Get all items except the one selected      
        Dim rows = GridView1.Rows.Cast(Of GridViewRow)().Where(Function(a) a <> row).ToList()
        Select Case btnUp.CommandName
            Case "Up"
                'If First Item, insert at end (rotating positions)              
                If row.RowIndex.Equals(0) Then
                    rows.Add(row)
                Else
                    rows.Insert(row.RowIndex - 1, row)
                End If
                Exit Select
            Case "Down"
                'If Last Item, insert at beginning (rotating positions)
                If row.RowIndex.Equals(GridView1.Rows.Count - 1) Then
                    rows.Insert(0, row)
                Else
                    rows.Insert(row.RowIndex + 1, row)
                End If
                Exit Select
        End Select
        GridView1.DataSource = rows.[Select](Function(a) New With { _
            Key .FirstName = DirectCast(a.FindControl("txtFirstName"), TextBox).Text, _
            Key .LastName = DirectCast(a.FindControl("txtLastName"), TextBox).Text _
        }).ToList()
        GridView1.DataBind()
    End Sub
    

    【讨论】:

    • 看到这让我真的很高兴我不再使用 VB。太笨重了……
    • Function(a) 上的行失败; a 未定义。
    • 重载失败,因为无法使用这些参数调用可访问的“Where”子句。此行出错 ....Dim rows = GridView1.Rows.Cast(Of GridViewRow)().Where(Function(a) a row).ToList
    • @marc11h - 听起来您没有 LINQ 引用。您能否确认在您的项目中引用了 System.Data.Linq 并且在您的文件中引用了 Imports
    • 两件事——“a row”应该是“a IsNot row”,而这里的“Exit Select”是不必要且非常不标准的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多