string.format c#




أفضل طريقة لتكرار حرف في C# (11)

أعلم أن هذا السؤال عمره خمس سنوات بالفعل ولكن هناك طريقة بسيطة لتكرار سلسلة حتى تعمل في .Net 2.0.

لتكرار سلسلة:

string repeated = new String('+', 3).Replace("+", "Hello, ");

عائدات

"اهلا اهلا اهلا، "

لتكرار سلسلة كصفيف:

// Two line version.
string repeated = new String('+', 3).Replace("+", "Hello,");
string[] repeatedArray = repeated.Split(',');

// One line version.
string[] repeatedArray = new String('+', 3).Replace("+", "Hello,").Split(',');

عائدات

{"اهلا اهلا اهلا"، ""}

أبقيها بسيطة.

ما هي أفضل طريقة لإنشاء سلسلة من \t 's في C #

أتعلم لغة C # ونجرِّب طرقًا مختلفة لقول الشيء نفسه.

Tabs(uint t) هي دالة تقوم بارجاع string بقيمة \t

على سبيل المثال ، ترجع Tabs(3) "\t\t\t"

أي من الطرق الثلاثة التالية لتطبيق Tabs(uint numTabs) هو الأفضل؟

بالطبع هذا يعتمد على ما تعنيه كلمة "أفضل".

  1. إصدار LINQ هو سطرين فقط ، وهو أمر رائع. ولكن هل يتم استدعاء المكالمات المتكررة واستهلاك الوقت / الموارد دون داعٍ؟

  2. إصدار StringBuilder واضح جداً ولكن هو فئة StringBuilder أبطأ بطريقة أو بأخرى؟

  3. إصدار string أساسي ، مما يعني أنه من السهل فهمه.

  4. هل لا يهم على الإطلاق؟ هل كلهم ​​متساوون؟

هذه كلها أسئلة لمساعدتي في الحصول على شعور أفضل بـ C #.

private string Tabs(uint numTabs)
{
    IEnumerable<string> tabs = Enumerable.Repeat("\t", (int) numTabs);
    return (numTabs > 0) ? tabs.Aggregate((sum, next) => sum + next) : ""; 
}  

private string Tabs(uint numTabs)
{
    StringBuilder sb = new StringBuilder();
    for (uint i = 0; i < numTabs; i++)
        sb.Append("\t");

    return sb.ToString();
}  

private string Tabs(uint numTabs)
{
    string output = "";
    for (uint i = 0; i < numTabs; i++)
    {
        output += '\t';
    }
    return output; 
}

أفضل إصدار هو بالتأكيد استخدام طريقة builtin:

string Tabs(int len) { return new string('\t', len); }

من الحلول الأخرى ، تفضل الأسهل ؛ فقط إذا كان هذا يثبت بطيئًا جدًا ، فاجتهد للحصول على حل أكثر كفاءة.

إذا كنت تستخدم StringBuilder وتعرف طوله الناتج مقدمًا ، فاستخدم أيضًا مُنشئًا مناسبًا ، فهذا أكثر كفاءة لأنه يعني أن تخصيصًا واحدًا يستغرق وقتًا طويلاً فقط ، ولا يوجد نسخ غير ضروري للبيانات. هراء: بالطبع الشفرة المذكورة أعلاه أكثر كفاءة.


المثال الأول الذي يستخدم Enumerable.Repeat :

private string Tabs(uint numTabs)
{
    IEnumerable<string> tabs = Enumerable.Repeat(
                                 "\t", (int) numTabs);
    return (numTabs > 0) ? 
            tabs.Aggregate((sum, next) => sum + next) : ""; 
} 

يمكن إعادة كتابتها بشكل أكبر مع String.Concat :

private string Tabs(uint numTabs)
{       
    return String.Concat(Enumerable.Repeat("\t", (int) numTabs));
}

باستخدام Enumerable.Repeat و Enumerable.Repeat الذي سيكون أقل تكلفة من استخدام String.Join

public static Repeat(this String pattern, int count)
{
    return String.Concat(Enumerable.Repeat(pattern, count));
}

طرق الإضافة:

public static string Repeat(this string s, int n)
{
    return new String(Enumerable.Range(0, n).SelectMany(x => s).ToArray());
}

public static string Repeat(this char c, int n)
{
    return new String(c, n);
}

في جميع إصدارات .NET ، يمكنك تكرار سلسلة على النحو التالي:

public static string Repeat(string value, int count)
{
    return new StringBuilder(value.Length * count).Insert(0, value, count).ToString();
}

لتكرار حرف ، فإن new String('\t', count) هو أفضل رهان لك. انظر share .


ماذا عن استخدام طريقة التمديد؟

public static class StringExtensions
{
   public static string Repeat(this char chatToRepeat, int repeat) {

       return new string(chatToRepeat,repeat);
   }
   public  static string Repeat(this string stringToRepeat,int repeat)
   {
       var builder = new StringBuilder(repeat*stringToRepeat.Length);
       for (int i = 0; i < repeat; i++) {
           builder.Append(stringToRepeat);
       }
       return builder.ToString();
   }
}

يمكنك بعد ذلك أن تكتب:

Debug.WriteLine('-'.Repeat(100)); // For Chars  
Debug.WriteLine("Hello".Repeat(100)); // For Strings

لاحظ أن اختبار الأداء باستخدام إصدار stringbuilder للأحرف البسيطة بدلاً من السلاسل يمنحك جزائية أداء رئيسية: على الكمبيوتر ، يكون الفرق في الأداء mesured هو 1:20 بين: Debug.WriteLine ('-'. Repeat (1000000)) // char version و
Debug.WriteLine ("-". كرر (1000000)) // string version


ماذا عن هذا:

string tabs = new String('\t', n);

حيث n هو عدد المرات التي تريد تكرار السلسلة فيها.

أو أفضل:

static string Tabs(int n)
{
    return new String('\t', n);
}

وماذا عن هذا:

//Repeats a character specified number of times
public static string Repeat(char character,int numberOfIterations)
{
    return "".PadLeft(numberOfIterations, character);
}

//Call the Repeat method
Console.WriteLine(Repeat('\t',40));

يمكنك إنشاء طريقة تمديد

static class MyExtensions
{
    internal static string Repeat(this char c, int n)
    {
        return new string(c, n);
    }
}

ثم يمكنك استخدامه على هذا النحو

Console.WriteLine('\t'.Repeat(10));

var str = new string(Enumerable.Repeat('\t', numTabs).ToArray());




string