سؤال

أمس سألت هذا سؤال. روبنز فارياس أجاب عليه من خلال الإشارة إلى هذا قطعة من الكود هو كتب. لا يمكن تجميع الجزء التالي منه بواسطة 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. لقد جربته باستخدام المحولات عبر الإنترنت دون جدوى.
هل كانت مفيدة؟

المحلول

  • يتطلب keyvaluepair وسيطتين من النوع. في إعلان المندوب الخاص بك يقول ببساطة KeyValuePair item, ، مع عدم وجود حجج نوع. تغيير هذا إلى delegate(KeyValuePair<string,string> item)
  • HttpUtility تم إعلانه في System.Web مساحة الاسم يضيف using System.Web; إلى استخدام العبارات في بداية الملف.

أنا شخصياً أجد أنه من الأسهل والنظافة استخدام نمط Lambda لهذا النوع من التعليمات البرمجية:

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

بمجرد الحصول على رمز C# للعمل ، التطور 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);
            })));

جرب ذلك.

  1. يبدو أن الرمز يقوم ببناء قائمة طلب الحصول على العناصر على سبيل المثال key1=value1&key2=value2. يتم ذلك عن طريق تحويل أولاً inputs صفيف في عناصر فردية key=value من ثم String.Joinجي مع ampersand. ثم يعيد بايت UTF8 في صفيف.

  2. هذا يعمل (انظر الكود).

  3. أنا لست مبرمجًا 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
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top