सी # में एक चरित्र को दोहराने का सबसे अच्छा तरीका


812

यह \tसी # में स्ट्रिंग पैदा करने का सबसे अच्छा तरीका क्या है

मैं C # सीख रहा हूं और एक ही बात कहने के विभिन्न तरीकों के साथ प्रयोग कर रहा हूं।

Tabs(uint t)एक समारोह है कि रिटर्न एक stringसाथ tकी राशि \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; 
}

जवाबों:


1490

इस बारे में क्या:

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

जहाँ nआप बार-बार स्ट्रिंग को दोहराना चाहते हैं।

या और अच्छा:

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

2
क्या किसी शब्द के लिए इसे दोहराने का कोई तरीका है? "समय" का उपयोग करने के बजाय 't' का उपयोग करने के बजाय
asdfkjasdfjk

6
@ user1478137 या, बेहतर (और भी नीचे): यह
Xynariz

161
string.Concat(Enumerable.Repeat("ab", 2));

रिटर्न

"ABAB"

तथा

string.Concat(Enumerable.Repeat("a", 2));

रिटर्न

"आ"

से ...

क्या कोई अंतर्निहित फ़ंक्शन स्ट्रिंग या चार को .net में दोहराने के लिए है?


1
इसे बिना Linq के और इसके साथ बेहतर करें StruingBuilder!
Bitterblue

4
'' StringBuilder '' आवश्यक रूप से अधिक तेज़ नहीं है stackoverflow.com/questions/585860/…
Schiavini

6
यह तेज़ नहीं हो सकता है, लेकिन यदि आप सामने की सही क्षमता को निर्दिष्ट करते हैं, तो यह मेमोरी एलोकेशन (दबाव) पर बचत कर सकता है, और यह उतना ही महत्वपूर्ण हो सकता है जितना कि इसे प्रोफाइल करने का माइक्रो बेंचमार्क।
वीकेम्पफ

1
var strRepeat = string.Concat (Enumerable.Repeat ("एबीसी", 1000000)); // 50ms
yongfa365

1
@ string.Joinउदाहरण में तेज था क्योंकि वे एक अंतरिक्ष सीमांकक का उपयोग कर रहे थे। string.Concatपरिसीमन न होने पर उपयुक्त है।
कार्टर मेडलिन

124

.NET के सभी संस्करणों में, आप इस प्रकार एक स्ट्रिंग दोहरा सकते हैं:

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

एक चरित्र को दोहराने के लिए, new String('\t', count) आपका सबसे अच्छा दांव है। @CMS द्वारा उत्तर देखें ।


7
यह स्ट्रिंग के लिए अब तक का सबसे तेज प्रदर्शन वार है। अन्य विधियाँ बहुत अधिक ओवरहेड बनाती हैं।
मध्याह्न

@midspace क्या आप जानते हैं कि यदि किसी ने समझाया है कि अन्य उत्तर क्यों खराब हैं? मैं मूल String.Concat सिर्फ StringBuilder के रूप में आंतरिक रूप से अनुकूलित किया जाएगा मान लिया जाएगा
मारी

@Marie निम्नलिखित लेख कुछ खूबियों की व्याख्या करता है। support.microsoft.com/en-au/help/306822/… अन्यथा दो अन्य कारक हैं, StringBuilder स्ट्रिंग्स की अनुमति देता है और केवल एक चार तक सीमित नहीं है (हालांकि यह मूल प्रश्न से संबंधित नहीं है), और स्ट्रिंग। ऊपर दिए गए कॉनैट उत्तर को पहले एनुमेरबल.पेट का उपयोग करके एक सरणी बनाना होगा। जैसा कि मैंने कहा, यह अनावश्यक उपरि है।
मध्याह्न

मैंने यह मान लिया था कि यह पहले एक सरणी नहीं बनाएगा क्योंकि यह केवल आइटम द्वारा आइटम को पुनरावृत्त कर सकता है। लिंक के लिए धन्यवाद, मैं इसे पढ़ने के लिए माफ कर दूंगा!
मारी

63

सबसे अच्छा संस्करण निश्चित रूप से बिलिन तरीके का उपयोग करने के लिए है:

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

अन्य समाधानों में से, सबसे आसान पसंद करते हैं; केवल अगर यह बहुत धीमा साबित हो रहा है, तो अधिक कुशल समाधान के लिए प्रयास करें।

अगर आप ए StringBuilder और इसकी परिणामी लंबाई को पहले से जानते हैं, तो एक उपयुक्त कंस्ट्रक्टर का भी उपयोग करें, यह बहुत अधिक कुशल है क्योंकि इसका मतलब है कि केवल एक समय लेने वाला आवंटन होता है, और डेटा की अनावश्यक नकल नहीं होती है। बकवास: बेशक उपरोक्त कोड अधिक कुशल है।


12
sb.Append ('\ t', len);
दान-गफ

7
मेरे बेंचमार्क दृष्टिकोण की new string('\t', len)तुलना में 2x और 7x के बीच तेजी से दिखाई दे रहे StringBuilderहैं। आपको क्यों लगता StringBuilderहै कि इस मामले में अधिक कुशल है?
स्ट्रिपिंगवर्यर

6
@StriplingWarrior इसे सही करने के लिए धन्यवाद (इसके बाद दो साल से यहां खड़ा है, कम नहीं!)।
कोनराड रुडोल्फ

51

विस्तार के तरीके:

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

39
एक बार जब लोग छोरों का इस्तेमाल करते थे
प्रभाकरन

2
@ प्रभाकरन मैं सहमत हूं लेकिन लिनक का लाभ संचार में है; यह लगभग हमेशा तुच्छ अभिव्यक्ति का उपयोग करने के लिए अनिवार्य निर्माणों का उपयोग करने के लिए तुच्छ है।
रॉड्रिक चैपमैन

10
Enumerable.Range(0, n).SelectMany(x => s)एक साधारण द्वारा प्रतिस्थापित किया जा सकता है Enumerable.Repeat(s, n)
१०:१० बजे पेलेक

5
@Palec नहीं, यह नहीं हो सकता। SelectManyप्रत्येक एकल डमी के लिए इच्छा xके एक दृश्य देना charमूल्यों (के बाद से string sलागू IEnumerable<char>), और उन सभी charदृश्यों एक लंबे समय से करने के लिए concatenated रहे हैं charअनुक्रम। इसके बजाय आप जो सुझाव देंगे वह ए IEnumerable<string>। ये एक जैसे नहीं हैं।
जेपी स्टिग नीलसन

2
मैं गलत था, @JeppeStigNielsen। सर उठाने के लिए धन्यवाद। अगर मैं वास्तव में उपयोग करना चाहता था Enumerable.Repeat, तो मुझे एक साथ तारों को जोड़ना होगा string.Concat(Enumerable.Repeat(s, n)):। यह पहले भी पोस्ट किया जा चुका है ।
पालेक

40

विस्तार विधि का उपयोग करने के बारे में क्या?


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

ध्यान दें कि स्ट्रिंग्स के बजाय सरल वर्णों के लिए स्ट्रिंगर संस्करण का उपयोग करने का एक प्रदर्शन परीक्षण आपको एक प्रमुख पूर्वसिद्धता प्रदान करता है: मेरे कंप्यूटर पर मेसर्ड प्रदर्शन में अंतर 1:20 के बीच है: Debug.WriteLine ('-'। दोहराएँ (1000000))। // चार संस्करण और
डीबग.वाइटलाइन ("-"। दोहराएँ (1000000)) // स्ट्रिंग संस्करण


2
स्ट्रिंग संस्करण के प्रदर्शन का उपयोग करके सुधार किया जा सकता है StringBuilder.Insert(Int32, String, Int32), जैसा कि बिनोज एंथोनी ने उत्तर दिया था
15

23

इस बारे में कैसा है:

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

4
हाहा .. यही कि जब मैं एक बार इस स्थिति में गिर गया तो मैं क्या सोच सकता था। लेकिन व्यक्तिगत रूप से मुझे new string('\t', 10)सबसे अच्छा समाधान मिला
शास्वत

इस ट्रिक का उपयोग एसेंशियल सी # 6.0 में भी किया जाता है ।
मनी ओरिएंटेड प्रोग्रामर

22

मुझे पता है कि यह प्रश्न पहले से ही पांच साल पुराना है, लेकिन एक स्ट्रिंग को दोहराने का एक सरल तरीका है जो कि .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(',');

रिटर्न

{"नमस्ते नमस्ते नमस्ते", ""}

इसे सरल रखें।


19

मान लीजिए कि आप कई बार '\ t' n संख्या दोहराना चाहते हैं, आप उपयोग कर सकते हैं;

String.Empty.PadRight(n,'\t')

1
धन्यवाद। यह भी बहुत तेज है। codereview.stackexchange.com/questions/36391/…
Sunsetquest

मैंने हमेशा इसे इस तरह से किया है। यहां तक ​​कि अगर एक विस्तार विधि में लिपटे हुए हैं, तो यह यहां लागू अन्य कार्यान्वयन की तुलना में सरल है। ध्यान दें कि ओपी केवल \ t दोहराना चाहता था, तार नहीं।
माइकल रिबन 2

17

आपका पहला उदाहरण जो उपयोग करता है 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));
}

14

इस्तेमाल करना String.Concatऔर Enumerable.Repeatजो इस्तेमाल करने से कम खर्चीला होगाString.Join

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


4

जवाब वास्तव में उस जटिलता पर निर्भर करता है जिसे आप चाहते हैं। उदाहरण के लिए, मैं अपने सभी इंडेंट को एक ऊर्ध्वाधर बार के साथ रेखांकित करना चाहता हूं, इसलिए मेरा इंडेंट स्ट्रिंग निम्नानुसार निर्धारित किया गया है:

return new string(Enumerable.Range(0, indentSize*indent).Select(
  n => n%4 == 0 ? '|' : ' ').ToArray());

3

और फिर भी एक और विधि

new System.Text.StringBuilder().Append('\t', 100).ToString()

StringBuilderकंस्ट्रक्टर को परिणामी स्ट्रिंग की लंबाई पास करने से वास्तविक उत्थान होता है। फिर भी, यह stringनिर्माणकर्ता का उपयोग करने की तुलना में अधिक चतुर और कम कुशल है जो किसी दिए गए चरित्र को दोहरा सकता है, जैसा कि पहले से ही स्वीकृत उत्तर में दिखाया गया है।
पलक

3

मेरे लिए ठीक है:

public static class Utils
{
    public static string LeftZerosFormatter(int zeros, int val)
    {
        string valstr = val.ToString();

        valstr = new string('0', zeros) + valstr;

        return valstr.Substring(valstr.Length - zeros, zeros);
    }
}

2

आप एक विस्तार विधि बना सकते हैं

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

फिर आप इसे इस तरह से उपयोग कर सकते हैं

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

1

एक शक के बिना स्वीकार किए गए उत्तर एकल चरित्र को दोहराने का सबसे अच्छा और सबसे तेज़ तरीका है।

बिनोज एंथोनी का जवाब एक स्ट्रिंग को दोहराने का एक सरल और काफी कुशल तरीका है।

हालाँकि, यदि आपको थोड़ा और कोड बुरा नहीं लगता है, तो आप कुशलतापूर्वक इन स्ट्रिंग्स को और भी तेज़ी से बनाने के लिए मेरे एरे फिल तकनीक का उपयोग कर सकते हैं। मेरे तुलना परीक्षणों में, StringBuilder.Insert कोड के समय का लगभग 35% नीचे निष्पादित कोड।

public static string Repeat(this string value, int count)
{
    var values = new char[count * value.Length];
    values.Fill(value.ToCharArray());
    return new string(values);
}

public static void Fill<T>(this T[] destinationArray, params T[] value)
{
    if (destinationArray == null)
    {
        throw new ArgumentNullException("destinationArray");
    }

    if (value.Length > destinationArray.Length)
    {
        throw new ArgumentException("Length of value array must not be more than length of destination");
    }

    // set the initial array value
    Array.Copy(value, destinationArray, value.Length);

    int copyLength, nextCopyLength;

    for (copyLength = value.Length; (nextCopyLength = copyLength << 1) < destinationArray.Length; copyLength = nextCopyLength)
    {
        Array.Copy(destinationArray, 0, destinationArray, copyLength, copyLength);
    }

    Array.Copy(destinationArray, 0, destinationArray, copyLength, destinationArray.Length - copyLength);
}

इस सरणी भरण तकनीक के बारे में अधिक जानने के लिए, एक मान के साथ एक सरणी भरने के लिए सबसे तेज़ तरीका देखें


0

इसे इस्तेमाल करे:

  1. Microsoft.VisualBasic संदर्भ जोड़ें
  2. उपयोग करें: स्ट्रिंग परिणाम = Microsoft.VisualBasic.Strings.StrDup (5, "hi");
  3. अगर यह आप के लिए काम करता है तो मुझे बतलाएगा।

किसी अन्य असेंबली पर निर्भरता जोड़ना और इसे लोड करने की आवश्यकता ज्यादातर मामलों में अनुचित है जब आपको ऐसी कार्यक्षमता की आवश्यकता होती है। फिर भी, यह जानकर अच्छा लगा कि .NET में ऐसा कुछ है।
पालेक

विभिन्न संदर्भों में कई पेशेवरों और विपक्ष हैं, इसलिए हर किसी को उस स्थिति के आधार पर निर्णय लेना चाहिए कि वह किस स्थिति में है /
Toso Pankovski

-1

Albeit पिछले सुझाव के समान है, मैं इसे सरल रखना और निम्नलिखित लागू करना पसंद करता हूं:

string MyFancyString = "*";
int strLength = 50;
System.Console.WriteLine(MyFancyString.PadRight(strLength, "*");

मानक .Net वास्तव में,


यह सिर्फ पैडिंग जोड़ देगा, दोहराता नहीं है
लेवी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.