Frage

Gestern fragte ich diese Frage . Rubens Farias beantwortet sie durch auf diese zeigen Stück Code schrieb er. Der folgende Teil davon kann nicht von MS Visual Studio 2010 Professional Beta 2 erstellt werden.

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);
            })));

Es gibt diese Fehler in Visual Studio. Leider Rubens antwortet nicht mehr.

Also ich habe folgende Fragen / Anfragen:

  1. Ich verstehe nicht, dieses Stück Code, bitte erklären, was genau passiert ist.
  2. Bitte erläutern Sie, wie dieser Teil für sie „arbeiten“ in VS neu geschrieben, um te werden muss.
  3. Bitte erklären, wie ich es zu VB.NET konvertieren soll. Ich habe es versucht, Online-Konverter ohne Erfolg verwenden.
War es hilfreich?

Lösung

  • KeyValuePair erfordert zwei Typargumente. In Ihrer Delegatendeklaration sagt es einfach KeyValuePair item, ohne Typargumente. Ändern Sie diese zu delegate(KeyValuePair<string,string> item)
  • HttpUtility wird im System.Web Namespace deklariert; hinzufügen using System.Web; auf die Verwendung von Aussagen am Anfang der Datei.

Persönlich finde ich es einfacher und sauberer Gebrauch Lambda-Stil für diese Art von Code:

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

Wenn Sie den C # -Code Arbeit bekommen haben, die DeveloperFusion C # VB.NET Konverter macht den Job:

' 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))))

Andere Tipps

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);
            })));

Versuchen Sie das mal.

  1. Der Code erscheint eine GET-Anfrage Liste der Elemente zu bauen z.B. key1=value1&key2=value2. Dies wird durch zunächst Umwandeln des inputs Array in einzelne Elemente key=value dann getan, um sie zusammen mit einem Ampersand String.Joining. Es gibt dann die UTF8 in einem Array Bytes.

  2. Das funktioniert (siehe Code).

  3. Ich bin keine VB.NET Programmierer, sorry, aber ich werde in einem zweiten mal ran.

Es ist Umwandeln der Eingänge Liste mit Schlüssel / Wert-Paare in eine Zeichenfolge, die aussieht wie ein Query-String (zB. Item1 = value1 & item2 = Wert2), dann die Umwandlung dieser in den Puffer Byte-Array mit UTF8-Codierung.

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top