Объясните фрагмент кода C# и преобразование в VB.NET.
-
23-09-2019 - |
Вопрос
Вчера я спросил об этом вопрос. Рубенс Фариас ответил на это, указав на это кусок кода он написал.Следующая его часть не может быть скомпилирована 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.К сожалению, Рубенс больше не отвечает.
Итак у меня следующие вопросы/просьбы:
- Я не понимаю этот фрагмент кода, объясните, пожалуйста, что именно происходит.
- Пожалуйста, объясните, как нужно переписать эту часть, чтобы она «работала» в VS.
- Пожалуйста, объясните, как мне преобразовать его в VB.NET.Я пробовал использовать онлайн-конвертеры, но безрезультатно.
Решение
- KeyValuePair требует два аргумента типа.В объявлении вашего делегата говорится просто
KeyValuePair item
, без аргументов типа.Измените это наdelegate(KeyValuePair<string,string> item)
HttpUtility
объявлено вSystem.Web
пространство имен;добавлятьusing System.Web;
к операторам использования в начале файла.
Лично я считаю, что для такого типа кода проще и чище использовать лямбда-стиль:
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))))
Другие советы
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, но через секунду попробую.
Он преобразует список входных данных, содержащий пары ключ/значение, в строку, которая очень похожа на строку запроса (например.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