Объяснить кусок кода C # и преобразование в VB.NET

2

Вчера я спросил об этом question. 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. К сожалению, Rubens больше не отвечает.

Итак, у меня есть следующие вопросы/запросы:

  • Я не понимаю этот фрагмент кода, объясните, что именно происходит.
  • Пожалуйста, объясните, как эту часть можно переписать, чтобы она "работала" в VS.
  • Пожалуйста, объясните, как я должен преобразовать его в VB.NET. Я пробовал это с помощью онлайн-конвертеров безрезультатно.
Теги:
compiler-construction

3 ответа

4
Лучший ответ
  • KeyValuePair требует двух аргументов типа. В объявлении делегата это просто KeyValuePair item, без аргументов типа. Измените это на delegate(KeyValuePair<string,string> item)
  • HttpUtility объявляется в пространстве имен System.Web; добавьте using System.Web; в операторы using в начале файла.

Лично мне легче и проще использовать лямбда-стиль для этого типа кода:

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

После того, как вы получили код С# для работы, конвертер DeveloperFusion С# в 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))))
  • 0
    +1, спасибо Фредрик!
  • 0
    Я до сих пор не могу заставить его работать. Он говорит: «Имя« HttpUtility »не объявлено. Я думаю, что оно доступно только для проектов ASP.NET? Я пытался добавить ссылку на system.web и system.web.dll, но не пошел. То же самое для вашего предложение: "используя System.Web", оно у меня уже есть.
Показать ещё 4 комментария
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);
            })));

Попробуйте это.

  • Этот код, по-видимому, строит список запросов GET, например. key1=value1&key2=value2. Это делается путем преобразования массива inputs в отдельные элементы key=value, а затем String.Join их вместе с амперсандом. Затем он возвращает байты UTF8 в массиве.

  • Это работает (см. код).

  • Я не программист VB.NET, извините, но через секунду у меня получится.

  • 0
    Фредрик Мёрк хорошо поработал над его преобразованием. Я сдаюсь, хе.
  • 0
    В любом случае, спасибо за объяснение.
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
  • 0
    Спасибо, но выдает те же сообщения об ошибках.
  • 0
    Похоже, у Фредрика есть последняя часть головоломки для вас ... Просто убедитесь, что у вас есть "Imports System.Web" в верхней части файла. Это может убрать ошибки.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню