সি # তে কোনও চরিত্র পুনরাবৃত্তি করার সর্বোত্তম উপায়


811

\tসি # তে এর স্ট্রিং উত্পন্ন করার সর্বোত্তম উপায় কী?

আমি সি # শিখছি এবং একই জিনিস বলার বিভিন্ন উপায় নিয়ে পরীক্ষা করছি।

Tabs(uint t)একটি ফাংশন যে আয় একটি stringসঙ্গে tপরিমাণ \tএর

উদাহরণস্বরূপ Tabs(3)রিটার্ন"\t\t\t"

বাস্তবায়নের এই তিনটি পদ্ধতির মধ্যে কোনটি Tabs(uint numTabs)সবচেয়ে ভাল?

অবশ্যই এটি "সেরা" অর্থ কী তার উপর নির্ভর করে।

  1. লিনকিউ সংস্করণটি মাত্র দুটি লাইন, যা দুর্দান্ত। কিন্তু পুনরাবৃত্তি এবং সমষ্টিগুলিতে কলগুলি কি অযথা সময় / সংস্থান গ্রহণ করে?

  2. StringBuilderসংস্করণ খুব স্পষ্ট কিন্তু StringBuilderশ্রেণী একরকম ধীর?

  3. stringসংস্করণ মৌলিক, যার মানে এটা বোঝা সহজ।

  4. এটা কি আদৌ কিছু যায় আসে না? তারা সবাই সমান?

সি # এর জন্য আরও ভাল অনুভূতি পেতে আমাকে সহায়তা করার জন্য এগুলি সমস্ত প্রশ্ন।

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
@ ব্যবহারকারী1478137 বা আরও ভাল (আরও নীচে): এটি
জয়নারিজ

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

রিটার্নস

"Abab"

এবং

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

রিটার্নস

"এএ"

থেকে ...

স্ট্রিংটির পুনরাবৃত্তি বা। নেট এ চার্ট করার জন্য কি কোনও অন্তর্নির্মিত ফাংশন রয়েছে?


1
লিনক ছাড়াই এবং এর মাধ্যমে এটি আরও ভাল করুন StruingBuilder!
বিটারব্লু

4
'' StringBuilder '' না অগত্যা দ্রুততর stackoverflow.com/questions/585860/...
Schiavini

6
এটি দ্রুত নাও হতে পারে, তবে আপনি সামনের দিকে সঠিক ক্ষমতা নির্দিষ্ট করে রাখলে এটি মেমরির বরাদ্দ (চাপ) বাঁচাতে পারে এবং এটি প্রোফাইলিংয়ের মাইক্রো মানদণ্ডের মতো গুরুত্বপূর্ণ হতে পারে।
wekempf

1
var স্ট্রিপেট = স্ট্রিং.কনক্যাট (গণনাযোগ্য R পুনর্বার ("এবিসি", 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)আপনার সেরা বাজি। @ সিএমএস এর উত্তর দেখুন ।


7
স্ট্রিংয়ের পক্ষে এটি এখন পর্যন্ত সবচেয়ে দ্রুততম পারফরম্যান্স wise অন্যান্য পদ্ধতিগুলি খুব বেশি ওভারহেড তৈরি করে।
মিডস্পেস

@ মিডস্পেস আপনি কি জানেন যে অন্য উত্তরগুলি আরও খারাপ কেন কেউ ব্যাখ্যা করেছেন? আমি নেটিভ String.Concat ঠিক যেমন StringBuilder যেমন অভ্যন্তরীণভাবে অপ্টিমাইজ করা হবে অধিকৃত যেত
মারি

@ মেরি নিম্নলিখিত নিবন্ধটি কিছু গুণাবলী ব্যাখ্যা করে। সমর্থন. microsoft.com/en-au/help/306822/… অন্যথায় আরও দুটি কারণ হ'ল, স্ট্রিংবিল্ডার স্ট্রিংকে অনুমতি দেয় এবং কেবল একটি চরকে সীমাবদ্ধ নয় (যদিও এটি মূল প্রশ্নের সাথে সম্পর্কিত নয়) এবং স্ট্রিং। উপরের কনক্যাট উত্তরের এনুম্যুয়েবল.রিপিট ব্যবহার করে প্রথমে একটি অ্যারে তৈরি করতে হবে। আমি যেমন বলেছি, এটি অপ্রয়োজনীয় ওভারহেড।
মিডস্পেস

আমি ধরে নিয়েছিলাম এটি প্রথমে একটি অ্যারে তৈরি করবে না কারণ এটি আইটেম দ্বারা কেবল আইট্রে পুনরাবৃত্তি করতে পারে। লিঙ্কটির জন্য আপনাকে ধন্যবাদ, আমি এটি পড়তে উপহার দেব!
মেরি

63

সর্বোত্তম সংস্করণটি অবশ্যই অন্তর্নির্মিত উপায়টি ব্যবহার করা:

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

অন্যান্য সমাধানগুলির মধ্যে সবচেয়ে সহজটিকে পছন্দ করুন; শুধুমাত্র যদি এটি খুব ধীর প্রমাণিত হয় তবে আরও কার্যকর সমাধানের জন্য চেষ্টা করুন।

যদি আপনি কোনও ব্যবহার করেন StringBuilderএবং এর ফলাফলের দৈর্ঘ্য আগেই জেনে থাকেন, তবে একটি উপযুক্ত নির্মাতাও ব্যবহার করুন, এটি অনেক বেশি দক্ষ কারণ এর অর্থ হ'ল কেবলমাত্র একটি সময় গ্রহণকারী বরাদ্দ সঞ্চালিত হয় এবং অযৌক্তিকভাবে ডেটা অনুলিপি করা হয় না। বাজে কথা: অবশ্যই উপরের কোডটি আরও কার্যকর।


12
sb.Append ('\ t', লেন);
ড্যান-জিএফ

7
আমার new string('\t', len)মানদণ্ডগুলি StringBuilderপদ্ধতির চেয়ে 2x এবং 7x এর মধ্যে দ্রুত প্রদর্শিত হচ্ছে । আপনি কেন StringBuilderএই ক্ষেত্রে আরও দক্ষ বলে মনে করেন ?
স্ট্রিপলিং ওয়ারিয়র

6
@ স্ট্রিপলিং ওয়ারিয়র এটি সংশোধন করার জন্য ধন্যবাদ (এটি এখানে দু'বছর দাঁড়িয়ে থাকার পরেও কম!)।
কনরাড রুডলফ

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
@ প্লেক না এটি পারবেন না। SelectManyপ্রতিটি একক ডামি জন্য ইচ্ছা xএকটি ক্রম দিতে charমান (যেহেতু string sকার্যকরী IEnumerable<char>), এবং ঐ সমস্ত charসিকোয়েন্স এক দীর্ঘ ঘনিভূত হয় charঅনুক্রম। আপনি যা পরামর্শ দেন তার পরিবর্তে একটি দেবে IEnumerable<string>। এটি এক নয়।
জেপ্পে স্টিগ

2
আমি ভুল ছিলাম, @ জেপ্পস্টিগনিয়েলসন। সতর্ক থাকুন জন্য ধন্যবাদ. আমি সত্যিই ব্যবহার করতে চেয়েছিলেন 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 এর মধ্যে: ডিবাগ.উইরাইটলাইন ('-'। পুনরাবৃত্তি (1000000)) // চর সংস্করণ এবং
ডিবাগ.উরাইটলাইন ("-"। পুনরাবৃত্তি (1000000)) // স্ট্রিং সংস্করণ


2
বিনোজ অ্যান্টনি উত্তরStringBuilder.Insert(Int32, String, Int32) হিসাবে, স্ট্রিং সংস্করণটির কর্মক্ষমতা ব্যবহার করে উন্নত হতে পারে ।
প্যালেক

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)সর্বোত্তম সমাধান হিসাবে খুঁজে পেয়েছি
শাশ্বত


22

আমি জানি যে এই প্রশ্নটি ইতিমধ্যে পাঁচ বছরের পুরানো তবে একটি স্ট্রিংয়ের পুনরাবৃত্তি করার একটি সহজ উপায় রয়েছে যা এমনকি নেট .০.০ এও কাজ করে।

একটি স্ট্রিং পুনরাবৃত্তি করতে:

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 পুনরাবৃত্তি করতে চেয়েছিল।
মাইকেল রিবন্স

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

কোনও সন্দেহ ছাড়াই গৃহীত উত্তর হ'ল একক চরিত্রের পুনরাবৃত্তি করার সর্বোত্তম এবং দ্রুততম উপায়।

বিনোজ অ্যান্টনির উত্তর একটি স্ট্রিংয়ের পুনরাবৃত্তি করার একটি সহজ এবং বেশ দক্ষ উপায়।

তবে, যদি আপনি আরও কিছু কোড মনে করেন না, তবে আপনি এই অ্যারেগুলি আরও দ্রুত তৈরি করতে দক্ষতার সাথে আমার অ্যারে ফিল প্রযুক্তি ব্যবহার করতে পারেন। আমার তুলনা পরীক্ষায়, নীচের কোডটি স্ট্রিংবিল্ডারের প্রায় 35% সময়ে কার্যকর করা হয়েছিল n

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. মাইক্রোসফ্ট.ভিজুয়ালবাসিক রেফারেন্স যুক্ত করুন
  2. ব্যবহার: স্ট্রিং ফলাফল = মাইক্রোসফ্ট.ভিজুয়ালবাসিক। স্ট্রিংস.এসটিআরডুপ (5, "হাই");
  3. যদি তোমার জন্য এটি কাজ করে, তাহলে আমাকে জানাও.

যখন আপনার যেমন কার্যকারিতা প্রয়োজন হয় তখন বেশিরভাগ ক্ষেত্রে অন্য সমাবেশে নির্ভরতা যুক্ত করা এবং এটি লোড করার প্রয়োজনটি অযৌক্তিক। তবুও, জেনে রাখা ভাল। নেট এ জাতীয় জিনিস আছে।
পেরেক

বিভিন্ন প্রসঙ্গে অনেকগুলি মতামত রয়েছে, সুতরাং সে / সে যে অবস্থানে আছে তার উপর নির্ভর করে প্রত্যেকেরই সিদ্ধান্ত নেওয়া উচিত
তোসো পানকভস্কি

-1

আগের পরামর্শের মতো হলেও, আমি এটিকে সহজ রাখতে এবং নিম্নলিখিতগুলি প্রয়োগ করতে চাই:

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

স্ট্যান্ডার্ড। সত্যিই ভাল,


এটি কেবল প্যাডিং যুক্ত করবে, পুনরাবৃত্তি করবে না
লেবি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.