سؤال

لقد حولت بلدي Datatable إلى json سلسلة استخدم الطريقة التالية ...

public string GetJSONString(DataTable Dt)
{
    string[] StrDc = new string[Dt.Columns.Count];
    string HeadStr = string.Empty;
    for (int i = 0; i < Dt.Columns.Count; i++)
    {
        StrDc[i] = Dt.Columns[i].Caption;
        HeadStr += "\"" + StrDc[i] + "\" : \"" + StrDc[i] + i.ToString() + "¾" + "\",";
    }
    HeadStr = HeadStr.Substring(0, HeadStr.Length - 1);
    StringBuilder Sb = new StringBuilder();

    Sb.Append("{\"" + Dt.TableName + "\" : [");
    for (int i = 0; i < Dt.Rows.Count; i++)
    {
        string TempStr = HeadStr;
        Sb.Append("{");
        for (int j = 0; j < Dt.Columns.Count; j++)
        {
            if (Dt.Rows[i][j].ToString().Contains("'") == true)
            {
                Dt.Rows[i][j] = Dt.Rows[i][j].ToString().Replace("'", "");
            }
            TempStr = TempStr.Replace(Dt.Columns[j] + j.ToString() + "¾", Dt.Rows[i][j].ToString());
        }
        Sb.Append(TempStr + "},");
    }
    Sb = new StringBuilder(Sb.ToString().Substring(0, Sb.ToString().Length - 1));
    Sb.Append("]}");
    return Sb.ToString();
}

هل هذا عادل بما فيه الكفاية أو لا يزال هناك هامش لتحسينه لجعله ينفذ بشكل أسرع .... أي اقتراح ...

هل كانت مفيدة؟

المحلول

جرب ما يلي giveacodicetagpre.

ستحتاج إلى ما يلي في الجزء العلوي من تخطيط صفحتك. giveacodicetagpre.

عندما كنت أحاول اكتشاف أي واحد يستخدم، استخدمت مصمم SharePoint.نشر ما لديك إلى موقع SharePoint الخاص بك، افتح تخطيط صفحتك في SPD وتعديله في الوضع المتقدم، ثم في علبة الأدوات ضمن حقول الصفحات، يجب أن تشاهد حقول نوع المحتوى الخاص بك.من خلال سحبها على الصفحة، سترى كيف ينبغي تعريفها.

نصائح أخرى

قد تكون هناك طرق للحصول عليها لتنفيذها بشكل أسرع - ولكن هل لديك أي إشارة إلى أنك بحاجة إلى لتنفيذ أسرع؟ هل لديك سبب وجيه للاعتقاد بأن هذا عنق الزجاجة كبير في الكود الخاص بك؟ إذا كان الأمر كذلك ، فقم بتقييم الكود مع بعض البيانات الحقيقية وملف الشخصيات الروتينية للتعرف على مكان الوقت.

حرف Wildcard * يتم دعمه فقط لبادئة مطابقة، "Wild *" لا "بطاقة" * ".أود أن أقترح عليك توسيع نهجك لوضع علامات على المستندات الخاصة بك.أود أن أقترح عليك استخدام بيانات التعريف SharePoint لوضع علامة على المستندات الخاصة بك بدلا من مجرد إنشاء عنوان.على سبيل المثال إضافة حقل للوثيقة والمنتج والتباين والتكميل والمعرف والنشر واللغة.إذا كنت تستخدم أعمدة الموقع في SharePoint 2013، فسيتم تحويلها إلى الخصائص المدارة لك وبعد ذلك يمكنك إجراء عملية بحث باستخدام KQL أو Expinement.

على سبيل المثال: المنتج: "Superthing2000" البديل: "B" المعرف="13580" PublishedDate> 08/01/2011

هناك عدة طرق لأتمتة استخراج البيانات، يمكن أن يكون جهاز استقبال الحدث هو حزم حل هذه بسهولة.

لماذا تعتقد أنه يحتاج إلى التحسين؟ هل هو بطيء حقا في بعض المواد القابلة للبيانات؟ كنت أقوم بتسلسل DataTable مع شيء مثل Newton Json Serializer ، إذا كان قابلاً للتسلسل على الإطلاق.

Refactor الكود الخاص بك ، استخدم أداة مثل Resharper ، JustCode وما إلى ذلك لترتيبها قليلاً. استخراج الطرق واستخدام الاختبارات الفردية (التطوير المدفوع باختبار) للعثور على الاختناقات في الكود الخاص بك ثم تعديلها.

ولكن يجب أن تكون خطوتك الأولى: ريب

المشكلة في الكود ليست سرعة ، لكنها لم يتم تنظيفها. لقد قمت ببعض التنظيف ، ولكن ربما يمكنك فعل المزيد:

public string GetJSONString2(DataTable table)
{
    StringBuilder headStrBuilder = new StringBuilder(table.Columns.Count * 5); //pre-allocate some space, default is 16 bytes
    for (int i = 0; i < table.Columns.Count; i++)
    {
        headStrBuilder.AppendFormat("\"{0}\" : \"{0}{1}¾\",", table.Columns[i].Caption, i);
    }
    headStrBuilder.Remove(headStrBuilder.Length - 1, 1); // trim away last ,

    StringBuilder sb = new StringBuilder(table.Rows.Count * 5); //pre-allocate some space
    sb.Append("{\"");
    sb.Append(table.TableName);
    sb.Append("\" : [");
    for (int i = 0; i < table.Rows.Count; i++)
    {
        string tempStr = headStrBuilder.ToString();
        sb.Append("{");
        for (int j = 0; j < table.Columns.Count; j++)
        {
            table.Rows[i][j] = table.Rows[i][j].ToString().Replace("'", "");
            tempStr = tempStr.Replace(table.Columns[j] + j.ToString() + "¾", table.Rows[i][j].ToString());
        }
        sb.Append(tempStr + "},");
    }
    sb.Remove(sb.Length - 1, 1); // trim last ,
    sb.Append("]}");
    return sb.ToString();
}

أود أن أقترح حلاً مختلفًا ، إذا كنت تستخدم .NET 3.0 أو 3.5

بدلا من القيام بذلك

  1. تحويل DataTable إلى XML
  2. استخدم xmlserializer لتحويل XML إلى كائن المجال الخاص بك
  3. باستخدام javaScriptSterializer (system.web.extensions.dll) لتسلسل كائن المجال إلى سلسلة JSON.
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top