আমি কি একটি স্ট্রিং "গুন" করতে পারি (সি # তে)?


136

ধরুন আমার কাছে একটি স্ট্রিং রয়েছে, উদাহরণস্বরূপ,

string snip =  "</li></ul>";

আমি কিছু পূর্ণসংখ্যার মানের উপর নির্ভর করে মূলত এটি একাধিকবার লিখতে চাই।

string snip =  "</li></ul>";
int multiplier = 2;

// TODO: magic code to do this 
// snip * multiplier = "</li></ul></li></ul>";

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


উত্তর:


222

নেট 4 এ আপনি এটি করতে পারেন:

String.Concat(Enumerable.Repeat("Hello", 4))

9
String.Concat (Enumerable.Repeat ( "হ্যালো", 4) .ToArray ()): এবং এটা .NET 3.5 আরো অনেক কিছু না
মার্ক ফোরম্যান

4
আমি মোটেও মার্জিত মনে করি না। অজগরটিতে এটি করার কোডটি হ'ল: স্লিপ * গুণক (এটি ভয়াবহ নয় .. তবে এটি সুন্দরও নয়)।
হেজহোগ

7
@ ডেমেডেজেডহোগ আমি জানি আপনি নিজের ডিমেনশিয়া স্বীকার করেছেন, তবে আপনার মতো দুর্ভোগও আপনি দেখতে পাচ্ছেন যে পাইথনের উদাহরণ কোনও সি # প্রশ্নের খুব ভাল উত্তর দিতে পারত না ... আমি মনে করি আমাদের বেশিরভাগই দেখতে পাবে ভাষা নির্বাচন সর্বদা একটি আপস হিসাবে কাজ করে এবং প্রায় যে কোনও প্রশ্নের কোনও উত্তর এডভোকেসির পক্ষে বা বিপক্ষে হতে পারে।
ডিন উইল

1
@ উইল ডিন: আমি আপনার এখানে কোডের কমনীয়তা সম্পর্কে কেবল ম্যাথু নিকোলসের বিবৃতি উল্লেখ করছি। যতদূর আমি বলতে পারি আপনার কোডটি সি # এর জন্য মার্জিত, যেমন এটি বর্তমানে দাঁড়িয়ে আছে, এই সমস্যার জন্য। আমি যে বিষয়টিটি তৈরির চেষ্টা করছি তা হ'ল: (আমি বিশ্বাস করি) মাইক্রোসফ্টের পক্ষে স্ট্রিং সিল করা খুব সহজ হবে (সিআর সিল করা থাকে) * অপারেটরকে ওভারলোড করার জন্য ইন * স্ট্রিংয়ের গুণকে অনুমতি দেয় C যা আসলে কিছু সর্বজনীন অর্থে মার্জিত হবে, তবে, এই মুহুর্তে বিদ্যমান # সি দ্বারা আরোপিত প্রতিবন্ধকতাগুলির প্রসঙ্গে কেবল মার্জিত নয়।
হেজেহোগ

@dementedhedgehog আমার কাছে এটি বাইনারি যা operator*উপস্থাপন করে তার বিপরীতে । তাদের প্রত্যেকের কাছে আমার ধারণা।
Tek

99

মনে রাখবেন যে আপনার "স্ট্রিং" যদি কেবল একটি একক অক্ষর হয় তবে এটি পরিচালনা করতে স্ট্রিং কনস্ট্রাক্টরের একটি ওভারলোড রয়েছে:

int multipler = 10;
string TenAs = new string ('A', multipler);

এটি সত্যিই প্রো।
জ্যাভেন জেরেয়ান

61

দুর্ভাগ্যক্রমে / ভাগ্যক্রমে, স্ট্রিং ক্লাসটি সিল করা হয়েছে যাতে আপনি এটি থেকে উত্তরাধিকারী হয়ে ও * অপারেটরকে ওভারলোড করতে পারবেন না। আপনি যদিও একটি এক্সটেনশন পদ্ধতি তৈরি করতে পারেন:

public static string Multiply(this string source, int multiplier)
{
   StringBuilder sb = new StringBuilder(multiplier * source.Length);
   for (int i = 0; i < multiplier; i++)
   {
       sb.Append(source);
   }

   return sb.ToString();
}

string s = "</li></ul>".Multiply(10);

5
আমি কোথায় যাচ্ছিলাম! আপনি সম্ভবত উত্সটি ব্যবহার করে অনুকূলিত করতে পারেন St স্ট্রিংবিল্ডার কর্টারে দৈর্ঘ্য * গুণক
মার্ক

2
মার্কের মন্তব্যটি যেখানে ছিল আমি ঠিক সেখানে গিয়েছিলাম :)
জন স্কিটি

1
আপনার প্রয়োজন (উত্স। দৈর্ঘ্য * গুণক), কেবল (গুণক) নয়
মার্ক গ্র্যাভেল

1
খুব নিশ্চিত. এটি পর্দার আড়ালে একটি স্ট্রিং (সেই দৈর্ঘ্যের) বরাদ্দ করে, তারপরে পরিবর্তিত করে। এটি নিয়মিত তালিকা <টি> ইত্যাদির মতো কাজ করে না
মার্ক গ্রাভেল

1
এক্সটেনশন পদ্ধতিটি এখানে আদর্শ।
ক্রিস বাল্যান্স

12

আমি এই সম্পর্কে ডাঃ জোকপু এর সাথে রয়েছি , তবে যদি কোনও কারণে আপনি অন্তর্নির্মিত কার্যকারিতা ব্যবহার করে প্রতারণা করতে চান তবে আপনি এরকম কিছু করতে পারেন:

string snip = "</li></ul>";
int multiplier = 2;

string result = string.Join(snip, new string[multiplier + 1]);

অথবা, আপনি। নেট 4 ব্যবহার করছেন:

string result = string.Concat(Enumerable.Repeat(snip, multiplier));

ব্যক্তিগতভাবে আমি যদিও বিরক্ত করব না - একটি কাস্টম এক্সটেনশন পদ্ধতিটি খুব সুন্দর।


1
আমি কখনই জানতাম না যে এরকম প্রতারণা আছে। =)
জর্নি

10

কেবল সম্পূর্ণতার স্বার্থে - এটি করার আরও একটি উপায় এখানে:

public static string Repeat(this string s, int count)
{
    var _s = new System.Text.StringBuilder().Insert(0, s, count).ToString();
    return _s;
}

আমি মনে করি কিছুক্ষণ আগে স্ট্যাক ওভারফ্লো থেকে আমি এটিটি টানলাম, তাই এটি আমার ধারণা নয়।


9

আপনাকে একটি পদ্ধতি লিখতে হবে - অবশ্যই, সি # 3.0 দিয়ে এটি কোনও এক্সটেনশন পদ্ধতি হতে পারে:

public static string Repeat(this string, int count) {
    /* StringBuilder etc */ }

তারপর:

string bar = "abc";
string foo = bar.Repeat(2);

এমনকি .NET3 এর এনিউমেরেবলও নেই? পুনরাবৃত্তি?
ডিন হবে

@ উইল -। নেট 3 ডাব্লুসিএফ / ডাব্লুপিএফ ইত্যাদি ছিল, তাই না; এটি নেট নেট 3.5 এ বিদ্যমান আছে, তবে তারপরে আপনার এটিরও দরকার string.Joinপড়বে - কেন কেবল এন এন বার লুপ করবেন না? আরও অনেক সরাসরি।
মার্ক গ্র্যাভেল

ধন্যবাদ - আমি 3.0 বনাম 3.5 সম্পর্কে সঠিকভাবে চিন্তা করছিলাম না। কেন কেবল একটি লুপ ব্যবহার করবেন না, অবশ্যই এটি কার্যকরী বনাম আবশ্যকীয় বিতর্কের পুরো সার? আমি নীচে নীচে একটি নেট 4 পোস্ট পোস্ট করেছি যা আমার মনে হয় যে 'কার্যকরী চতুরতা' বনাম 'লুপিং স্পষ্টতা' বিতর্কে খুব খারাপ নয়।
ডিন

8

কিছুটা দেরী (এবং কেবল মজাদার জন্য), আপনি যদি *এই কাজের জন্য সত্যই অপারেটরটি ব্যবহার করতে চান তবে আপনি এটি করতে পারেন:

public class StringWrap
{
    private string value;
    public StringWrap(string v)
    {
        this.value = v;
    }
    public static string operator *(StringWrap s, int n)
    {
        return s.value.Multiply(n); // DrJokepu extension
    }
}

এবং তাই:

var newStr = new StringWrap("TO_REPEAT") * 5;

উল্লেখ্য, যতদিন আপনি তাদের জন্য একটি যুক্তিসঙ্গত আচরণ খুঁজে পেতে সক্ষম হয়, এছাড়াও আপনি অন্যান্য অপারেটরদের সব ব্যবস্থা করতে সক্ষম StringWrapবর্গ, মত \, ^, %ইত্যাদি ...

পুনশ্চ:

Multiply()@ ডিআরজোকপুতে সমস্ত অধিকার সংরক্ষিত ;-) -কে এক্সটেনশন ক্রেডিটগুলি


7

এটি অনেক বেশি সংক্ষিপ্ত:

new StringBuilder().Insert(0, "</li></ul>", count).ToString()

using System.Text;এই ক্ষেত্রে নেমস্পেসটি আমদানি করা উচিত।



2

আপনার কাছে .Net 3.5 থাকলেও 4.0 নয়, আপনি System.Linq এর ব্যবহার করতে পারেন

String.Concat(Enumerable.Range(0, 4).Select(_ => "Hello").ToArray())

একটি একক স্ট্রিং পেতে আপনার এখনও প্রয়োজন String.Concat, এবং 3.5 এও আপনার প্রয়োজন .ToArray()। সর্বাধিক মার্জিত সমাধান নয়, আমি ভয় করি।
কোবি

2

যেহেতু প্রত্যেকে নিজের নিজস্ব নেট .NET4 / লিনক উদাহরণ যুক্ত করছে, তাই আমি নিজের নিজস্ব যুক্তও করতে পারি। (মূলত, এটি ডক জোকপু এর, এক-লাইনারে হ্রাস)

public static string Multiply(this string source, int multiplier) 
{ 
    return Enumerable.Range(1,multiplier)
             .Aggregate(new StringBuilder(multiplier*source.Length), 
                   (sb, n)=>sb.Append(source))
             .ToString();
}

0

ঠিক আছে, আমি এখানে বিষয়টি গ্রহণ করব:

public static class ExtensionMethods {
  public static string Multiply(this string text, int count)
  {
    return new string(Enumerable.Repeat(text, count)
      .SelectMany(s => s.ToCharArray()).ToArray());
  }
}

আমি অবশ্যই কিছুটা নিরীহ হয়ে উঠছি, কিন্তু যখন কোড-উত্পন্নকারী ক্লাসগুলিতে আমার ট্যাবুলেশন থাকা দরকার, তখন গণনাযোগ্য ep পুনরাবৃত্তিটি আমার জন্য তা করে। এবং হ্যাঁ, স্ট্রিংবিল্ডার সংস্করণও খুব ভাল।


0

কেবলমাত্র ভবিষ্যতের রেফারেন্সের জন্য আমার এটি এখানে রয়েছে:

    /// <summary>
    /// Repeats a System.String instance by the number of times specified;
    /// Each copy of thisString is separated by a separator
    /// </summary>
    /// <param name="thisString">
    /// The current string to be repeated
    /// </param>
    /// <param name="separator">
    /// Separator in between copies of thisString
    /// </param>
    /// <param name="repeatTimes">
    /// The number of times thisString is repeated</param>
    /// <returns>
    /// A repeated copy of thisString by repeatTimes times 
    /// and separated by the separator
    /// </returns>
    public static string Repeat(this string thisString, string separator, int repeatTimes) {
        return string.Join(separator, ParallelEnumerable.Repeat(thisString, repeatTimes));
    }

আমি আশা করি আপনি এরকম ParallelEnumerableপরিস্থিতিতে সত্যই ব্যবহার করবেন না । string.Joinক্রম হিসাবে উপাদানগুলি ব্যবহার করা দরকার, সুতরাং তাদের প্রজন্মকে সমান্তরাল করে তোলা উচিত।
গাবে

@ গ্যাবে: যেহেতু আইটেমগুলি একই এবং সত্যই কেবল এই স্ট্রিংয়ের অনুলিপি, তাই এখানে অর্ডার দেওয়ার বিষয়ে চিন্তা করার দরকার নেই, আমার ধারণা।
জ্রোনি

আমি ক্ষেত্রের অনেক শিক্ষকের সাথে একমত যে আপনার বক্তব্যটি কী বোঝাতে চান তা সাধারণত কোড করা ভাল। আপনি এই সমান্তরাল চান তা বলার কোনও লাভ নেই এবং কেবল গোপনে ভাবুন "ভাল, আমি জানি এটি যে কোনওভাবেই এই বিশেষ ক্ষেত্রে সমান্তরাল হবে না"
শেহে

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