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

Вчера зададох този въпрос. Рубенс Фариас отговори, като посочи това част от код, който той написа. Следната част от него не може да бъде компилирана от 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. Опитах го с помощта на онлайн конвертори без резултат.

person George    schedule 27.01.2010    source източник
comment
Хм, за този Рубенс ли говориш? :) stackoverflow.com/users/113794/rubens-farias   -  person Peter Lillevold    schedule 27.01.2010


Отговори (3)


  • 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))))
person Fredrik Mörk    schedule 27.01.2010
comment
Все още не мога да го накарам да работи. Пише, че името „HttpUtility“ не е декларирано. Предполагам, че е достъпно само за ASP.NET проекти? Опитах се да добавя препратка към system.web и system.web.dll, но не се получи. Същото за вашето предложение: използвайки System.Web, вече го имам. - person George; 27.01.2010
comment
@iar: трябва да се уверите, че проектът, в който живее кодът, има препратка към сборката System.Web и че има оператор за използване (или импортиране във VB.NET) за импортиране на пространството от имена в кодовия файл. Алтернатива на оператора using/Imports е да квалифицирате името в кода (System.Web.HttpUtility.UrlEncode(...). Все пак трябва да добавите препратка към сборката System.Web. - person Fredrik Mörk; 27.01.2010
comment
Пише, че „HttpUtility“ не е член на „Web“. Сега имам този ред код: System.Web.HttpUtility.UrlEncode(item.Value). Също така импортира System.Web върху файла. Когато добавям препратка с помощта на Добавяне на препратка в разтвора Explorer, нямам System.Web в раздела .NET. Както вече сте забелязали, все още не съм много опитен потребител ;) - person George; 27.01.2010
comment
@iar: това вероятно е свързано с избраната целева рамка (System.Web не е наличен, ако целевата рамка е .NET Framework 4 клиентски профил). За да разрешите (за VB.NET проект): щракнете двукратно върху My Project, изберете раздела Compile, щракнете върху бутона Advanced Compile Options (далеч надолу на страницата) и променете Target Framework на .NET Framework 4. - person Fredrik Mörk; 27.01.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 програмист, съжалявам, но ще пробвам след секунда.

person Codesleuth    schedule 27.01.2010
comment
Фредрик Мьорк се е свършил добре с конвертирането му. Отказвам се, хех. - person Codesleuth; 27.01.2010
comment
Благодаря все пак за обяснението. - person George; 27.01.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
person Will    schedule 27.01.2010
comment
Изглежда, че Фредрик има последното парче от пъзела за вас... Просто се уверете, че имате Imports System.Web в горната част на файла. Това може да изчисти грешките. - person Will; 27.01.2010
comment
Имам Imports System.Web, но не премахва грешката, че името „HttpUtility“ не е декларирано. - person George; 27.01.2010
comment
Тук се компилира добре, след като коригирах второто споменаване на KeyValuePair да казва KeyValuePair(Of String, String). Актуализирах конвертирания код, така че да показва пълния клас. - person Will; 28.01.2010