Объяснить кусок кода C # и преобразование в VB.NET - PullRequest
2 голосов
/ 27 января 2010

Вчера я задал этот вопрос . Рубенс Фариас ответил, указав на этот фрагмент кода , который он написал. Следующая часть не может быть скомпилирована 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. Я пробовал использовать онлайн-конвертеры безрезультатно.

Ответы [ 3 ]

4 голосов
/ 27 января 2010
  • 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))));

После того как код 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 голос
/ 27 января 2010

Он преобразует список входных данных, содержащий пары ключ / значение, в строку, очень похожую на строку запроса (например, 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
1 голос
/ 27 января 2010
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, извините, но я пойду через секунду.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...