【问题标题】:Convert LinQ code from C# code to VB.Net将 LinQ 代码从 C# 代码转换为 VB.Net
【发布时间】:2016-12-17 14:40:55
【问题描述】:

如何将此代码重写为 VB.net?在线转换工具在尝试转换函数的返回部分时会作呕。

private static DataColumn[] ParseColumns(string tableHtml)
{
    MatchCollection headerMatches = Regex.Matches(
        tableHtml,
        HeaderPattern,
        ExpressionOptions);

    return (from Match headerMatch in headerMatches
            select new DataColumn(headerMatch.Groups[1].ToString())).ToArray();
}

private static DataColumn[] GenerateColumns(MatchCollection rowMatches)
{
    int columnCount = Regex.Matches(
        rowMatches[0].ToString(),
        CellPattern,
        ExpressionOptions).Count;

    return (from index in Enumerable.Range(0, columnCount)
            select new DataColumn("Column " + Convert.ToString(index))).ToArray();
}

具体来说,在线工具会给我这样的东西:

    Private Shared Function GenerateColumns(rowMatches As MatchCollection) As DataColumn()
     Dim columnCount As Integer = Regex.Matches(rowMatches(0).ToString(), CellPattern, ExpressionOptions).Count

     Return (From index In Enumerable.Range(0, columnCount)New DataColumn("Column " + Convert.ToString(index))).ToArray()   End Function

最后一部分不正确:

(From index In Enumerable.Range(0, columnCount)New DataColumn("Column " + Convert.ToString(index))).ToArray()

我不明白这段 C# 代码试图做什么——它看起来像 LINQ 或类似的东西。

谢谢!

【问题讨论】:

  • 不要使用正则表达式处理 html。 Html 是有效的 xml,例如 XDocumentXElement 类将是更好的方法
  • @Fabio:在一般情况下,这是真的,但如果你知道你正在解析的内容的性质,并且它是一个有限的范围,正则表达式或其他形式的匹配/提取都可以。
  • @siride,用 Regex 解析 HTML 会带来不同的问题——例如:http://stackoverflow.com/a/1732454/1565525。使用 Xml 解析器将是处理 html 的更清晰、可读和可维护的方式。
  • @Fabio:是的,我们都看过那个愚蠢的答案。它在互联网上无处不在,并且仅在一般意义上是正确的。再次,了解您的域名。您不必使用最强大的工具来解决给定的问题。否则,我们将构建完整的编译器工具链来处理每种新的数据格式。例如,如果您要对格式一致的数据表进行屏幕抓取,那么正则表达式可能就可以了。

标签: c# asp.net vb.net linq


【解决方案1】:

那是 LINQ 代码。它的伟大之处在于它完全是方法调用链的语法糖。 from 用于从可枚举中引入循环变量(有效地),select 生成结果。后者实际上对应一个方法Select()。您可以按如下方式重写 C# LINQ 代码:

Enumerable.Range(0, columnCount).Select(index => new DataColumn("Column " + index)).ToArray();

这将创建一个 DataColumn 对象数组,从 0 到给定 columnCount 的每个数字对应一个。您可以在 VB 中使用基本相同的语法,只是 lambda 看起来会有些不同:

Enumerable.Range(0, columnCount).Select(Function(index) New DataColumn("Column " & index)).ToArray()

我想这就是您需要帮助的全部内容。

【讨论】:

  • 谢谢!基于此,我还发现这些也有效:“Return(From headerMatch In headerMatches Select New DataColumn(headerMatch.Groups(1).ToString())).ToArray()”和“Return(From index In Enumerable.Range (0, columnCount) Select New DataColumn("Column" & Convert.ToString(index))).ToArray()"
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-14
  • 2011-03-18
相关资源
最近更新 更多