解释一段 C# 代码以及到 VB.NET 的转换

问题描述 投票:0回答:3

昨天我问了这个问题Rubens Farias 通过指向他写的这段代码来回答这个问题。以下部分无法通过 MS Visual Studio 2010 Professional Beta 2 编译。

byte[] buffer = 
Encoding.UTF8.GetBytes(
    String.Join("&", 
        Array.ConvertAll<KeyValuePair<string, string>, string>(
            inputs.ToArray(),
            delegate(KeyValuePair item)
            {
                return item.Key + "=" + HttpUtility.UrlEncode(item.Value);
            })));

它在 Visual Studio 中给出了 这些 错误。不幸的是鲁本斯不再回复了。

所以我有以下问题/要求:

  1. 我不明白这段代码,请解释到底发生了什么。
  2. 请解释如何重写这部分才能使其在 VS 中“工作”。
  3. 请解释一下我应该如何将其转换为 VB.NET。我已经尝试使用在线转换器,但无济于事。
c# vb.net
3个回答
4
投票
  • KeyValuePair 需要两个类型参数。在您的委托声明中,它只是简单地写着
    KeyValuePair item
    ,没有类型参数。将其更改为
    delegate(KeyValuePair<string,string> item)
  • HttpUtility
    System.Web
    命名空间中声明;将
    using System.Web;
    添加到文件开头的 using 语句中。

就我个人而言,我发现对此类代码使用 lambda 样式更容易、更简洁:

byte[] buffer =
     Encoding.UTF8.GetBytes(
         String.Join("&",
             Array.ConvertAll<KeyValuePair<string, string>, string>(
                 inputs.ToArray(), (item) => item.Key + "=" + HttpUtility.UrlEncode(item.Value))));

一旦您获得了可以运行的 C# 代码,DeveloperFusion C# 到 VB.NET 转换器即可完成工作:

' Converted from delegate style C# implementation '
Dim buffer As Byte() = Encoding.UTF8.GetBytes( _
    [String].Join("&", _
    Array.ConvertAll(Of KeyValuePair(Of String, String), String)(inputs.ToArray(), _
        Function(item As KeyValuePair(Of String, String)) (item.Key & "=") + HttpUtility.UrlEncode(item.Value))))

' Converted from Lambda style C# implementation '
Dim buffer As Byte() = Encoding.UTF8.GetBytes( _
    [String].Join("&", _
    Array.ConvertAll(Of KeyValuePair(Of String, String), String)(inputs.ToArray(), _
        Function(item) (item.Key & "=") + HttpUtility.UrlEncode(item.Value))))

1
投票
byte[] buffer = 
Encoding.UTF8.GetBytes(
    String.Join("&", 
        Array.ConvertAll<KeyValuePair<string, string>, string>(
            inputs.ToArray(),
            delegate(KeyValuePair<string, string> item)
            {
                return item.Key + "=" + System.Web.HttpUtility.UrlEncode(item.Value);
            })));

尝试一下。

  1. 该代码似乎正在构建一个项目的 GET 请求列表,例如

    key1=value1&key2=value2
    。这是通过首先将
    inputs
    数组转换为
    key=value
    的各个元素,然后用 & 符号将它们
    String.Join
    组合在一起来完成的。然后它返回数组中的 UTF8 字节。

  2. 这有效(参见代码)。

  3. 我不是 VB.NET 程序员,抱歉,但我稍后会尝试一下。


1
投票

它将包含键/值对的输入列表转换为看起来很像查询字符串的字符串(例如 item1=value1&item2=value2),然后使用 UTF8 编码将其转换为缓冲区字节数组。

Public Class _Default
    Inherits System.Web.UI.Page

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        Dim inputs As New List(Of KeyValuePair(Of String, String))
        inputs.Add(New KeyValuePair(Of String, String)("a", "adata"))

        Dim buffer As Byte() = _
            Encoding.UTF8.GetBytes( _
                String.Join("&", _
                Array.ConvertAll(Of KeyValuePair(Of String, String), String)( _
                    inputs.ToArray(), _
                    Function(item As KeyValuePair(Of String, String)) _
                    item.Key & "=" & HttpUtility.UrlEncode(item.Value) _
                )))
    End Sub
End Class
© www.soinside.com 2019 - 2024. All rights reserved.