স্ট্রিং আউটপুট: সি # তে ফর্ম্যাট বা কনক্যাট?


177

বলুন যে আপনি আউটপুট বা কনক্যাট স্ট্রিং করতে চান। আপনি নীচের কোন শৈলী পছন্দ করেন?

  • var p = new { FirstName = "Bill", LastName = "Gates" };

  • Console.WriteLine("{0} {1}", p.FirstName, p.LastName);

  • Console.WriteLine(p.FirstName + " " + p.LastName);

আপনি বরং ফর্ম্যাট ব্যবহার করেন বা আপনি কেবল কংক্রিট স্ট্রিংগুলি ব্যবহার করেন? তোমার কি পছন্দ? এর মধ্যে একটির কি আপনার চোখে আঘাত হচ্ছে?

অন্যটি না ব্যবহার করার জন্য আপনার কি কোনও যুক্তিযুক্ত যুক্তি আছে?

আমি দ্বিতীয় জন্য যেতে হবে।

উত্তর:


88

এই কোড ব্যবহার করে দেখুন।

এটি আপনার কোডের একটি সামান্য পরিবর্তিত সংস্করণ।
১. আমি কনসোল.ওরাইটলাইনকে সরিয়েছি কারণ এটি পরিমাপ করার চেষ্টা করছি তার চেয়ে কম মাত্রার মাত্রা কম orders
২. আমি লুপের আগে স্টপওয়াচটি শুরু করছি এবং ঠিক পরে এটি বন্ধ করে দিচ্ছি, যদি ফাংশনটি উদাহরণস্বরূপ কার্যকর করতে 26.4 টিকগুলি গ্রহণ করে তবে আমি নির্ভুলতা হারাচ্ছি না।
৩. কিছুটা পুনরাবৃত্তি দ্বারা আপনি যেভাবে ফলাফল ভাগ করেছেন তা ভুল ছিল। আপনার যদি 1000 মিলি সেকেন্ড এবং 100 মিলিসেকেন্ড থাকে তবে কী হয় তা দেখুন। উভয় পরিস্থিতিতে, আপনি এটিতে 1000000 দিয়ে ভাগ করার পরে 0 এমএস পাবেন।

Stopwatch s = new Stopwatch();

var p = new { FirstName = "Bill", LastName = "Gates" };

int n = 1000000;
long fElapsedMilliseconds = 0, fElapsedTicks = 0, cElapsedMilliseconds = 0, cElapsedTicks = 0;

string result;
s.Start();
for (var i = 0; i < n; i++)
    result = (p.FirstName + " " + p.LastName);
s.Stop();
cElapsedMilliseconds = s.ElapsedMilliseconds;
cElapsedTicks = s.ElapsedTicks;
s.Reset();
s.Start();
for (var i = 0; i < n; i++)
    result = string.Format("{0} {1}", p.FirstName, p.LastName);
s.Stop();
fElapsedMilliseconds = s.ElapsedMilliseconds;
fElapsedTicks = s.ElapsedTicks;
s.Reset();


Console.Clear();
Console.WriteLine(n.ToString()+" x result = string.Format(\"{0} {1}\", p.FirstName, p.LastName); took: " + (fElapsedMilliseconds) + "ms - " + (fElapsedTicks) + " ticks");
Console.WriteLine(n.ToString() + " x result = (p.FirstName + \" \" + p.LastName); took: " + (cElapsedMilliseconds) + "ms - " + (cElapsedTicks) + " ticks");
Thread.Sleep(4000);

এগুলি আমার ফলাফল:

1000000 x ফলাফল = স্ট্রিং.ফর্ম্যাট ("{0} {1}", পি। ফার্স্টনাম, পি। শেষ নাম); গৃহীত: 618ms - 2213706 টিকগুলি
1000000 x ফলাফল = (পি। ফার্স্টনাম + "" + পি। শেষ নাম); গৃহীত: 166ms - 595610 টিক্স


1
খুব আকর্ষণীয়. আমি গড়ে 224ms বনাম 48ms, একটি x4.66 উন্নতি পেয়েছি, আপনার x3.72 এর চেয়েও ভাল। আমি অবাক হই যে কোনও পোস্ট-সংকলন সরঞ্জাম রয়েছে যা এর আইএল পুনরায় লিখতে পারে string.Formatযে কোনও যৌগিক বিন্যাস বৈশিষ্ট্য (যেমন সহজ {0}) ব্যবহার করে না এবং এগুলিকে যথেষ্ট দ্রুত স্ট্রিং কনকেন্টেশন দিয়ে প্রতিস্থাপন করে। আমি অবাক হই যে পোস্টশার্পের মতো কোনও বিদ্যমান আইএল লেখক যেমন এরকম কীর্তি অর্জনযোগ্য।
অ্যালন গুরালেনেক

31
স্ট্রিংগুলি অপরিবর্তনীয়, এর অর্থ একই কোডের মেমরিটি আপনার কোডটিতে ব্যবহৃত হয়। একই দুটি স্ট্রিং একসাথে যুক্ত করা এবং বারবার একই নতুন স্ট্রিং তৈরি করা স্মৃতিকে প্রভাবিত করে না। । নেট একই স্মৃতি রেফারেন্সটি ব্যবহার করতে যথেষ্ট স্মার্ট। সুতরাং আপনার কোড দুটি কনক্যাট পদ্ধতির মধ্যে পার্থক্যকে সত্যই পরীক্ষা করে না। নীচে আমার উত্তর কোড দেখুন।
লুডিংটন

1
সত্যিই, আমি সবসময়ই
দৃaten়সংকল্পবদ্ধ

সুতরাং গতি কি অন্যকে বেছে নেওয়ার একমাত্র কারণ?
নিকো

158

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

অকাল অপটিমাইজেশন = ব্যর্থ।

আমি String.Formatবিকল্পটি দিয়ে যাব , কেবল কারণ এটি কোনও স্থাপত্যের দিক থেকে সর্বাধিক উপলব্ধি করে। যতক্ষণ না এটি সমস্যা হয়ে ওঠে ততক্ষণ আমি পারফরম্যান্সের বিষয়ে চিন্তা করি না (এবং যদি তা হয়ে থাকে তবে আমি নিজেকে জিজ্ঞাসা করব: আমার কি একবারে মিলিয়ন নাম প্রকাশ করা দরকার? নিশ্চয় তারা সবাই পর্দায় ফিট করে না ...)

আপনার গ্রাহক পরবর্তীতে এটি পরিবর্তন করতে চান কিনা তা বিবেচনা করুন যাতে তারা প্রদর্শন করতে হবে "Firstname Lastname"বা "Lastname, Firstname."বিন্যাস বিকল্পের সাথে কনফিগার করতে পারে , এটি সহজ - কেবল বিন্যাসের স্ট্রিংটি স্যুপ আউট করে। কনক্যাট সহ, আপনার অতিরিক্ত কোড দরকার। নিশ্চিত যে এই বিশেষ উদাহরণে বড় চুক্তির মতো শোনাচ্ছে না তবে এক্সট্রোপোলেট।


47
"অকাল অপটিমাইজেশন == ব্যর্থ" এর ক্ষেত্রে ভাল পয়েন্ট, হ্যাঁ। তবে, যখন আপনি এক্সিকিউশন পদচিহ্নের জন্য অর্থ প্রদান শুরু করেন (কোনও পরিষেবা হিসাবে ক্লাউড এবং অবকাঠামো, কেউ?) এবং / বা আপনি কোনও কিছুর জন্য 1 মিলিয়ন ব্যবহারকারীকে সমর্থন করা শুরু করেন তখন কোনও অনুরোধে কোনও একক ব্যবহারকারীর প্রতিক্রিয়া প্রশ্ন নয়। কোনও ব্যবহারকারীর কাছে একটি অনুরোধ সেবা দেওয়ার জন্য আপনার নীচের লাইনের পাশাপাশি একটি স্কেল ইস্যু যদি / যখন কয়েক হাজার হাজার কল আসে ...
আইডনপওয়ার্ড

23
এটি ঠিক সম্পূর্ণ ভুল। ওয়েব বিকাশের পরিবেশে প্রায়শই আপনার স্ট্রিং জেনারেশন কোডটি আপনার মডেল, ভিউ এবং নিয়ামক উভয়ই গভীর হয় এবং প্রতি পৃষ্ঠা লোডকে কয়েক হাজার বার বলা যেতে পারে। স্ট্রিং জেনারেশন কোডটি 50% মূল্যায়নের সময় ব্যয়কে হ্রাস করা একটি বিশাল বিজয় হতে পারে।
বেনজামিন সুসমান

2
এর মতো একটি প্রশ্ন কেবল ওপির এক উদাহরণে প্রয়োগ করতে যাচ্ছেনা। আপনার উত্তরটি সেই ধরণের জিনিস যা লোকেরা মনে রাখতে পারে "আমি কোন উপায়ে স্ট্রিংগুলি একত্রিত করব?" তারা তাদের কোড সব লিখতে হিসাবে ।
ফিল মিলার

6
@ বেঞ্জামিন: ... এক্ষেত্রে আপনি প্রোফাইলটি খুঁজে পেয়েছেন এবং এটি আপনার বাধা হিসাবে খুঁজে পাবেন। আমি অর্থের সাথে বাজি ধরব যে আপনি কেবল এটিকে কোথাও থেকে টানছেন, যদিও; অতীতে বেশ কয়েকটি ওয়েব অ্যাপ লিখেছেন এবং প্রোফাইল দিয়েছিলেন, আমি প্রায় সর্বদা প্রতিক্রিয়া বারে (সার্ভারে) ডাটাবেস অনুসন্ধান হতে বাধা পেয়েছি ।
ব্লুরাজা - ড্যানি পিফ্লুঘুফুট

2
এটি অবশ্যই স্পষ্টভাবে অপরিবর্তনীয় নয়। বেশ ভ্রান্তি। স্ট্রিং পারফরম্যান্স সম্পূর্ণরূপে ইউআইগুলি স্টল করতে পারে, বিশেষত। নেট এ আপনি যদি প্রচুর ফর্ম্যাটিং এবং স্ট্রিং বিল্ডিং করছেন। ubiquity.acm.org/article.cfm?id=1513451
ব্যবহারকারী9999999991

54

ওহে প্রিয় - অন্য জবাবগুলির একটি পড়ার পরে আমি ক্রিয়াকলাপের ক্রমটিকে উল্টে দেওয়ার চেষ্টা করেছি - সুতরাং প্রথমে কনকন্টেশনটি সম্পাদন করছি, তারপরে স্ট্রিং.ফর্ম্যাট ...

Bill Gates
Console.WriteLine(p.FirstName + " " + p.LastName); took: 8ms - 30488 ticks
Bill Gates
Console.WriteLine("{0} {1}", p.FirstName, p.LastName); took: 0ms - 182 ticks

সুতরাং ক্রিয়াকলাপগুলির ক্রমটি একটি বিশাল পার্থক্য তৈরি করে বা বরং প্রথম ক্রিয়াকলাপটি সর্বদা খুব ধীর হয়।

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

Bill Gates
Console.WriteLine(FirstName + " " + LastName); took: 5ms - 20335 ticks
Bill Gates
Console.WriteLine(FirstName + " " + LastName); took: 0ms - 156 ticks
Bill Gates
Console.WriteLine(FirstName + " " + LastName); took: 0ms - 122 ticks
Bill Gates
Console.WriteLine("{0} {1}", FirstName, LastName); took: 0ms - 181 ticks
Bill Gates
Console.WriteLine("{0} {1}", FirstName, LastName); took: 0ms - 122 ticks
Bill Gates
String.Concat(FirstName, " ", LastName); took: 0ms - 142 ticks
Bill Gates
String.Concat(FirstName, " ", LastName); took: 0ms - 117 ticks

আপনি একই পদ্ধতির পরবর্তী রানগুলি দেখতে পাচ্ছেন (আমি কোডটি 3 টি পদ্ধতিতে রিফ্যাক্টর করেছি) ক্রমবর্ধমান দ্রুততর হয়। সর্বাধিক দ্রুত কনসোল.ব্রাইটলাইন (স্ট্রিং.কনক্যাট (...)) পদ্ধতি হিসাবে দেখা যায়, তার পরে সাধারণ কনটেনটেশন এবং তারপরে ফর্ম্যাট করা ক্রিয়াকলাপ।

প্রথম ক্রিয়াকলাপটি সমস্ত সময়কে লাইনে ফিরিয়ে আনার আগে কনসোল.রাইটলাইন ("শুরু!") স্থাপন করে সূচনা শুরুর প্রাথমিক বিলম্ব সম্ভবত কনসোল স্ট্রিমের সূচনা হতে পারে।


2
তারপরে আপনার পরীক্ষাগুলি থেকে সম্পূর্ণ কনসোল.উরাইটলাইন সরান। এটি ফলাফল স্কুইং হয়!
CShark

এই যথাযথ কারণে পারফরম্যান্স পরীক্ষা চালানোর সময় আমি সর্বদা একটি নিক্ষেপ বা "নিয়ন্ত্রণ" দৃশ্যের সাথে শুরু করি
ড্রাজাস

36

স্ট্রিংগুলি অপরিবর্তনীয়, এর অর্থ একই কোডের মেমরিটি আপনার কোডটিতে ব্যবহৃত হয়। একই দুটি স্ট্রিং একসাথে যুক্ত করা এবং বারবার একই নতুন স্ট্রিং তৈরি করা স্মৃতিকে প্রভাবিত করে না। । নেট একই স্মৃতি রেফারেন্সটি ব্যবহার করতে যথেষ্ট স্মার্ট। সুতরাং আপনার কোড দুটি কনক্যাট পদ্ধতির মধ্যে পার্থক্যকে সত্যই পরীক্ষা করে না।

আকারের জন্য এটি ব্যবহার করে দেখুন:

Stopwatch s = new Stopwatch();

int n = 1000000;
long fElapsedMilliseconds = 0, fElapsedTicks = 0, cElapsedMilliseconds = 0, cElapsedTicks = 0, sbElapsedMilliseconds = 0, sbElapsedTicks = 0;

Random random = new Random(DateTime.Now.Millisecond);

string result;
s.Start();
for (var i = 0; i < n; i++)
    result = (random.Next().ToString() + " " + random.Next().ToString());
s.Stop();
cElapsedMilliseconds = s.ElapsedMilliseconds;
cElapsedTicks = s.ElapsedTicks;
s.Reset();

s.Start();
for (var i = 0; i < n; i++)
    result = string.Format("{0} {1}", random.Next().ToString(), random.Next().ToString());
s.Stop();
fElapsedMilliseconds = s.ElapsedMilliseconds;
fElapsedTicks = s.ElapsedTicks;
s.Reset();

StringBuilder sb = new StringBuilder();
s.Start();
for(var i = 0; i < n; i++){
    sb.Clear();
    sb.Append(random.Next().ToString());
    sb.Append(" ");
    sb.Append(random.Next().ToString());
    result = sb.ToString();
}
s.Stop();
sbElapsedMilliseconds = s.ElapsedMilliseconds;
sbElapsedTicks = s.ElapsedTicks;
s.Reset();

Console.WriteLine(n.ToString() + " x result = string.Format(\"{0} {1}\", p.FirstName, p.LastName); took: " + (fElapsedMilliseconds) + "ms - " + (fElapsedTicks) + " ticks");
Console.WriteLine(n.ToString() + " x result = (p.FirstName + \" \" + p.LastName); took: " + (cElapsedMilliseconds) + "ms - " + (cElapsedTicks) + " ticks");
Console.WriteLine(n.ToString() + " x sb.Clear();sb.Append(random.Next().ToString()); sb.Append(\" \"); sb.Append(random.Next().ToString()); result = sb.ToString(); took: " + (sbElapsedMilliseconds) + "ms - " + (sbElapsedTicks) + " ticks");
Console.WriteLine("****************");
Console.WriteLine("Press Enter to Quit");
Console.ReadLine();

নমুনা আউটপুট:

1000000 x result = string.Format("{0} {1}", p.FirstName, p.LastName); took: 513ms - 1499816 ticks
1000000 x result = (p.FirstName + " " + p.LastName); took: 393ms - 1150148 ticks
1000000 x sb.Clear();sb.Append(random.Next().ToString()); sb.Append(" "); sb.Append(random.Next().ToString()); result = sb.ToString(); took: 405ms - 1185816 ticks

1
উত্তরে একটি স্ট্রিংবিল্ডার এবং নমুনা আউটপুট যুক্ত করা হয়েছে
মাইসচুল্ড

আমি দেখতে string.Formatএখানে ব্যবহারকারীর ক্ষুদ্র পারফরম্যান্সের মূল্য কতটা কার্যকর । স্থপতিগতভাবে এটি আরও ভাল কারণ এর অর্থ আপনি আরও সহজে বিন্যাসটি পরিবর্তন করতে পারেন। তবে স্ট্রিংবিল্ডার আমি সত্যিই এর বিন্দু দেখতে পাই না। এখানের অন্য প্রতিটি থ্রেড বলছে আপনার স্ট্রিংবিল্ডার ব্যবহার করা উচিত স্ট্রিংবিল্ডারকে স্ট্রিংবিল্ডার ব্যবহার না করে aten সুবিধা কী? স্পষ্টতই গতি নয়, যেমন এই বেঞ্চমার্কটি প্রমাণ করে।
roryok

22

দরিদ্র অনুবাদকদের প্রতি করুণা করুন

আপনি যদি জানেন যে আপনার অ্যাপ্লিকেশনটি ইংরাজীতে থাকবে, তবে ঠিক আছে, ঘড়ির টিকগুলি সংরক্ষণ করুন। যাইহোক, অনেক সংস্কৃতি সাধারণত শেষ নামের প্রথম নাম দেখতে পাবে, উদাহরণস্বরূপ, ঠিকানাগুলি।

সুতরাং ব্যবহার করুন string.Format(), বিশেষত যদি আপনি নিজের অ্যাপ্লিকেশনটি যে কোনও জায়গায় যেতে চান যে ইংরেজি প্রথম ভাষা নয়।


2
string.Format()বিভিন্ন সংস্কৃতিতে কীভাবে আলাদা আচরণ হবে ? এটি কি প্রথম নামটি পরে পদবি ছাপবে না? দেখে মনে হচ্ছে আপনাকে উভয় পরিস্থিতিতেই আলাদা সংস্কৃতিটি বিবেচনায় নিতে হবে। আমার মনে হচ্ছে আমি এখানে কিছু মিস করছি।
ব্রুটস ওয়েম্ব

2
আমি @ ড্যাংজার জোনের সাথে একমত .. কীভাবে string.Format()জানবেন যে আপনি কোনও ঠিকানার জন্য একটি নাম ব্যবহার করছেন? যদি সংস্কৃতির উপর ভিত্তি করে string.Format()অদলবদল {0} {1}হয়, আমি এটিকে ভাঙ্গা বিবেচনা করব।
অ্যালেক্স ম্যাকমিলান

2
আমি বিশ্বাস করি জেরেমি যে পয়েন্টটি তৈরির চেষ্টা করেছিলেন তা হ'ল বিভিন্ন দেশকে সমর্থন করার জন্য বর্ণিত দৃশ্যে কোনও ভাষা সংস্থায় ফরম্যাটটির স্ট্রিংটি বের করে নেওয়া উপযুক্ত হতে পারে। বেশিরভাগ দেশের ক্ষেত্রে স্ট্রিংটি "{0} {1}" হবে তবে যেসব দেশের উপাধি প্রথমটি হ'ল সাধারণত পরিচালনা (যেমন হাঙ্গেরি, হংকং, কম্বোডিয়া, চীন, জাপান, কোরিয়া, মাদাগাস্কার, তাইওয়ান, ভিয়েতনাম এবং ভারতের অংশ) যে স্ট্রিংটি তার পরিবর্তে "{1} {0}" হবে।
রিচার্ড জে ফস্টার 13

প্রকৃতপক্ষে. বা আরও সূক্ষ্মভাবে, ব্যক্তির একটি বৈশিষ্ট্য হিসাবে ফর্ম্যাট স্ট্রিং যুক্ত করুন। উদাহরণস্বরূপ, আমি আমার প্রথম নামটির পরে আমার উপাধি রাখতে চাই তবে আমার সহকর্মী বেনগ তা করেন না।
জেরেমি ম্যাকগি

14

100,000 পুনরাবৃত্তির উপরে আমার ফলাফলগুলি এখানে রয়েছে:

Console.WriteLine("{0} {1}", p.FirstName, p.LastName); took (avg): 0ms - 689 ticks
Console.WriteLine(p.FirstName + " " + p.LastName); took (avg): 0ms - 683 ticks

এবং এখানে বেঞ্চ কোডটি রয়েছে:

Stopwatch s = new Stopwatch();

var p = new { FirstName = "Bill", LastName = "Gates" };

//First print to remove the initial cost
Console.WriteLine(p.FirstName + " " + p.LastName);
Console.WriteLine("{0} {1}", p.FirstName, p.LastName);

int n = 100000;
long fElapsedMilliseconds = 0, fElapsedTicks = 0, cElapsedMilliseconds = 0, cElapsedTicks = 0;

for (var i = 0; i < n; i++)
{
    s.Start();
    Console.WriteLine(p.FirstName + " " + p.LastName);
    s.Stop();
    cElapsedMilliseconds += s.ElapsedMilliseconds;
    cElapsedTicks += s.ElapsedTicks;
    s.Reset();
    s.Start();
    Console.WriteLine("{0} {1}", p.FirstName, p.LastName);
    s.Stop();
    fElapsedMilliseconds += s.ElapsedMilliseconds;
    fElapsedTicks += s.ElapsedTicks;
    s.Reset();
}

Console.Clear();

Console.WriteLine("Console.WriteLine(\"{0} {1}\", p.FirstName, p.LastName); took (avg): " + (fElapsedMilliseconds / n) + "ms - " + (fElapsedTicks / n) + " ticks");
Console.WriteLine("Console.WriteLine(p.FirstName + \" \" + p.LastName); took (avg): " + (cElapsedMilliseconds / n) + "ms - " + (cElapsedTicks / n) + " ticks");

সুতরাং, আমি জানি না কার উত্তরটি উত্তর হিসাবে চিহ্নিত করবে :)


কেন এই উত্তরের পটভূমি নীল?
ব্যবহারকারী 88637

@ ইয়াসি এটি নীল কারণ উত্তরদাতা প্রশ্নকর্তার
মতোই

9

এরকম সাধারণ দৃশ্যে কনক্যাটেনটিং স্ট্রিংগুলি সূক্ষ্ম - এটি লাস্টনাম, ফার্স্টনেম এর চেয়ে আরও জটিল কিছু নিয়ে জটিল। বিন্যাসের সাহায্যে আপনি এক নজরে দেখতে পারবেন কোডটি পড়ার পরে স্ট্রিংয়ের চূড়ান্ত কাঠামোটি কী হবে, তা দৃaten়তার সাথে চূড়ান্ত ফলাফলটি তাত্ক্ষণিকভাবে সনাক্ত করা প্রায় অসম্ভব হয়ে যায় (এর মতো খুব সাধারণ উদাহরণ ব্যতীত)।

দীর্ঘমেয়াদী এর অর্থ হ'ল আপনি যখন আপনার স্ট্রিং ফর্ম্যাটে পরিবর্তন আনতে ফিরে আসবেন, আপনি হয় পপ-ইন করার এবং ফর্ম্যাট স্ট্রিংটিতে কয়েকটি সামঞ্জস্য করার ক্ষমতা রাখবেন, বা আপনার ব্রাউকে কুঁচকে উঠবেন এবং সমস্তদিকে ঘুরতে শুরু করুন বিভিন্ন ধরণের সম্পত্তি অ্যাক্সেসরের সাথে টেক্সট মিশ্রিত হয়, যা সমস্যাগুলি প্রবর্তন করার সম্ভাবনা বেশি।

আপনি .NET 3.5 ব্যবহার করছেন যদি আপনি এই জাতীয় মতো একটি এক্সটেনশন পদ্ধতি ব্যবহার করতে পারেন এবং এই জাতীয় কাফ সিনট্যাক্স বন্ধ করে একটি সহজে প্রবাহিত করতে পারেন:

string str = "{0} {1} is my friend. {3}, {2} is my boss.".FormatWith(prop1,prop2,prop3,prop4);

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

string name = String.Format(ApplicationStrings.General.InformalUserNameFormat,this.FirstName,this.LastName);

7

খুব সাধারণ হেরফেরের জন্য আমি সংক্ষেপণ ব্যবহার করতাম তবে একবার আপনি 2 বা 3 উপাদান ছাড়িয়ে গেলে ফর্ম্যাটটি আরও উপযুক্ত আইএমও হয়ে যায়।

স্ট্রিং.ফর্ম্যাট পছন্দ করার আরেকটি কারণ হ'ল .NET স্ট্রিংগুলি পরিবর্তনযোগ্য এবং এটি এভাবে করা কম অস্থায়ী / মধ্যবর্তী কপি তৈরি করে।


6

আমি শৈলীর অগ্রাধিকারটি সম্পূর্ণরূপে বুঝতে পেরেছিলাম এবং আংশিকভাবে আমার নিজের পছন্দের ভিত্তিতে আমার প্রথম উত্তরের জন্য একযোগে বাছাই করেছি, আমার সিদ্ধান্তের কিছু অংশ এই ধারণার উপর ভিত্তি করে ছিল যে উপসংহারটি আরও দ্রুত হবে। সুতরাং, কৌতূহলের বাইরে, আমি এটি পরীক্ষা করেছি এবং ফলাফলগুলি বিস্ময়কর হয়েছিল, বিশেষত এত ছোট স্ট্রিংয়ের জন্য।

নিম্নলিখিত কোড ব্যবহার করে:

    System.Diagnostics.Stopwatch s = new System.Diagnostics.Stopwatch();

    var p = new { FirstName = "Bill", LastName = "Gates" };

    s.Start();
    Console.WriteLine("{0} {1}", p.FirstName, p.LastName);
    s.Stop();
    Console.WriteLine("Console.WriteLine(\"{0} {1}\", p.FirstName, p.LastName); took: " + s.ElapsedMilliseconds + "ms - " + s.ElapsedTicks + " ticks");

    s.Reset();
    s.Start();
    Console.WriteLine(p.FirstName + " " + p.LastName);
    s.Stop();

    Console.WriteLine("Console.WriteLine(p.FirstName + \" \" + p.LastName); took: " + s.ElapsedMilliseconds + "ms - " + s.ElapsedTicks + " ticks");

আমি নিম্নলিখিত ফলাফল পেয়েছি:

Bill Gates
Console.WriteLine("{0} {1}", p.FirstName, p.LastName); took: 2ms - 7280 ticks
Bill Gates
Console.WriteLine(p.FirstName + " " + p.LastName); took: 0ms - 67 ticks

বিন্যাস পদ্ধতিটি 100 গুণ বেশি ধীর গতির !! কনটেনটেশন এমনকি 1 মিমি হিসাবে নিবন্ধভুক্ত হয় নি, এজন্যই আমি টাইমার টিকগুলি আউটপুটও করি।


2
তবে অবশ্যই পরিমাপ পেতে আপনার একাধিকবার অপারেশন করা উচিত।
এরিক্কালেন

2
এবং কনসোলে কলটি হারিয়ে ফেলুন rit রাইটলাইন () যেহেতু এটি প্রশ্নের ক্ষেত্রের বাইরে?
এইডানাপওয়ার্ড

আপনি স্ট্রিংবিল্ডার দিয়ে পরীক্ষা করেছিলেন? ;)
niico

6

সি # 6.0 থেকে শুরু করে বিরতিযুক্ত স্ট্রিংগুলি এটি করতে ব্যবহৃত হতে পারে, যা আরও বেশি করে ফর্ম্যাটকে সহজতর করে।

var name = "Bill";
var surname = "Gates";
MessageBox.Show($"Welcome to the show, {name} {surname}!");

একটি ইন্টারপোল্টেড স্ট্রিং এক্সপ্রেশনটি টেম্পলেট স্ট্রিংয়ের মতো দেখায় যার মধ্যে এক্সপ্রেশন থাকে। একটি ইন্টারপোল্টেড স্ট্রিং এক্সপ্রেশন এক্সপ্রেশনগুলির ফলাফলের টসস্ট্রিং উপস্থাপনার সাথে থাকা এক্সপ্রেশনগুলিকে প্রতিস্থাপন করে একটি স্ট্রিং তৈরি করে।

ইন্টারপোলটেড স্ট্রিংগুলির স্ট্রিংয়ের অনুরূপ পারফরম্যান্স রয়েছে Forফর্ম্যাট, তবে মান এবং এক্সপ্রেশনগুলি ইন-লাইন sertedোকানো হয়েছে এর কারণে উন্নত পঠনযোগ্যতা এবং সংক্ষিপ্ত বাক্য গঠন।

দয়া করে স্ট্রিং ইন্টারপোলেশন সম্পর্কিত এই ডটনেটার্পারস নিবন্ধটি দেখুন

আপনি যদি নিজের স্ট্রিংগুলিকে ফর্ম্যাট করার জন্য কোনও ডিফল্ট উপায় সন্ধান করেন তবে এটি পঠনযোগ্যতা এবং কার্য সম্পাদনের দিক থেকে অর্থবোধ করে (মাইক্রোসেকেন্ডগুলি আপনার নির্দিষ্ট ব্যবহারের ক্ষেত্রে কোনও পার্থক্য আনতে চলেছে যদি তা না থাকে)।


5

বেসিক স্ট্রিং কনটেনটেশনের জন্য, আমি সাধারণত দ্বিতীয় স্টাইলটি ব্যবহার করি - সহজেই পড়া সহজ এবং সহজ। তবে, আমি যদি আরও জটিল স্ট্রিং সংমিশ্রণটি করি তবে আমি সাধারণত স্ট্রিং.ফর্ম্যাটটির জন্য বেছে নিই।

স্ট্রিং.ফর্ম্যাট প্রচুর উদ্ধৃতি এবং প্লাসগুলিতে সঞ্চয় করে ...

Console.WriteLine("User {0} accessed {1} on {2}.", user.Name, fileName, timestamp);
vs
Console.WriteLine("User " + user.Name + " accessed " + fileName + " on " + timestamp + ".");

মাত্র কয়েকটি অধ্যায় সংরক্ষণ করা হয়েছে, তবে আমি মনে করি, উদাহরণ হিসাবে ফর্ম্যাটটি এটি আরও পরিষ্কার করে makes


5

পারফোন এবং সিএলআর মেমরি কাউন্টার ব্যবহার করে আপনার মেমরিটি দেখার আরও ভাল পরীক্ষা। আমার বোধগম্যতা হল যে আপনি স্ট্রিংটি ব্যবহার করতে চান তার পুরো কারণটি For

স্ট্রিংবিল্ডার এবং স্ট্রিং.ফোরাম্যাট, যদিও সম্ভাব্য ধীরে ধীরে ধীরে ধীরে কম মেমরি দক্ষ efficient

স্ট্রিং কনটেনটেশন সম্পর্কে এত খারাপ কী?


আমি রাজী; প্রতিটি স্ট্রিং অপারেশন স্ট্রিংয়ের একটি নতুন কপি তৈরি করে। সেই সমস্ত স্মৃতি শীঘ্রই বা পরে আবর্জনা সংগ্রহকারী দ্বারা পুনরুদ্ধার করা হবে। সুতরাং, প্রচুর স্ট্রিং বরাদ্দ করা আপনাকে পরে কামড়ানোর জন্য ফিরে আসতে পারে।
মার্নিক্স ভ্যান ভ্যালেন

5

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

অন্যটি সুবিধা হ'ল আমি বিশ্বাস করি যে কোনও একটি কার্য সম্পাদন, কারণ পরবর্তীকালে কনসোল.আরাইট পদ্ধতিতে চূড়ান্ত স্ট্রিংটি পাস করার আগে 2 টি স্ট্রিং তৈরির বিবৃতি দেয়। আমি বিশ্বাস করি এমন কভারগুলির নীচে স্ট্রিং.ফর্ম্যাট স্ট্রিংবিল্ডার ব্যবহার করে, তাই একাধিক কনটেন্টেশন এড়ানো হয়।

তবে এটি লক্ষ করা উচিত যে আপনি যদি প্যারামিটারগুলি স্ট্রিংয়ে যাচ্ছেন For ফর্ম্যাট (এবং অন্যান্য কনসোল.ওরাইটের মতো অন্যান্য পদ্ধতি) মান ধরণের হয় তবে সেগুলি পাস করার আগে বক্স করা হবে, যা তার নিজস্ব কার্যকারিতা হিট সরবরাহ করতে পারে। এখানে ব্লগ পোস্ট


1
সেই ব্লগ পোস্টটি এখন: jeffbarnes.net/blog/post/2006/08/08/… এ । আমি সম্পাদনা করতে অপর্যাপ্ত প্রতিনিধি ভুগছি।
রিচার্ড স্লেটার

5

এখন থেকে 19 আগস্ট, 2015 থেকে এক সপ্তাহ, এই প্রশ্নটি ঠিক সাত (7) বছরের পুরানো হবে। এটি করার আরও ভাল উপায় আছে। রক্ষণাবেক্ষণের দিক থেকে আরও ভাল কারণ আমি কেবল স্ট্রাকটেটিং স্ট্রিংয়ের সাথে তুলনা করে কোনও পারফরম্যান্স পরীক্ষা করিনি (তবে এই দিনগুলিতে কী তা আসে? কয়েক মিলি সেকেন্ডের ব্যবধানে?) সি # 6.0 দিয়ে এটি করার নতুন উপায় :

var p = new { FirstName = "Bill", LastName = "Gates" };
var fullname = $"{p.FirstName} {p.LastName}";

এই নতুন বৈশিষ্ট্যটি আরও ভাল , আইএমও এবং আমাদের ক্ষেত্রে আরও ভাল কারণ আমাদের কোড রয়েছে যেখানে আমরা ক্যোরিস্ট্রিংগুলি তৈরি করি যার মানগুলি কয়েকটি কারণের উপর নির্ভর করে। এমন একটি ক্যোরিস্ট্রিং কল্পনা করুন যেখানে আমাদের 6 টি আর্গুমেন্ট রয়েছে। সুতরাং এটির পরিবর্তে উদাহরণস্বরূপ:

var qs = string.Format("q1={0}&q2={1}&q3={2}&q4={3}&q5={4}&q6={5}", 
    someVar, anotherVarWithLongName, var3, var4, var5, var6)

ইন এ জাতীয় লেখা যেতে পারে এবং এটি পড়া সহজ:

var qs=$"q1={someVar}&q2={anotherVarWithLongName}&q3={var3}&q4={var4}&q5={var5}&q6={var6}";

প্রকৃতপক্ষে, সি # 6.0 এর নতুন উপায়টি পূর্ববর্তী বিকল্পগুলির চেয়ে ভাল - কমপক্ষে পঠনযোগ্যতার দৃষ্টিকোণ থেকে।
ফিলিপ

সেটা ঠিক. এবং এটি আরও সুরক্ষিত কারণ আপনি কোন বিষয়টিকে কোন সূচক (স্থানধারক) এ নিয়ে যান সে বিষয়ে উদ্বিগ্ন হওয়ার দরকার নেই যেহেতু আপনি যে বস্তুটি যেখানে চান তা সরাসরি স্থাপন করবেন।
ভন বনাম

বিটিডাব্লু, এটি আসলে ফর্ম্যাট (কমপক্ষে রোজলিনের সাথে) কল করে calls
ফিলিপ

বিটিডাব্লু, যা এই পোস্টারটি উল্লেখ করছে তাকে "স্ট্রিং ইন্টারপোলেশন" বলা হয় এবং এই থ্রেডের অন্যত্র সম্বোধন করা হয়।
CShark

4
  1. ফর্ম্যাট করা হ'ল এটি করার ".NET" উপায়। কিছু সংশোধনকারী সরঞ্জাম (একটির জন্য রিফ্যাক্টর) এমনকি বিন্যাস শৈলীটি ব্যবহার করার জন্য কনক্যাট-স্টাইল কোডটি রিফ্যাক্টারের প্রস্তাব করবে।
  2. সংকলকটির জন্য অনুকূলকরণ করা ফর্ম্যাটিং করা সহজ (যদিও দ্বিতীয়টি সম্ভবত 'কনক্যাট' পদ্ধতিটি দ্রুত ব্যবহার করতে রিফ্যাক্টর হবে)।
  3. ফর্ম্যাটিং সাধারণত পড়ার জন্য পরিষ্কার হয় (বিশেষত "অভিনব" ফর্ম্যাটিং সহ)।
  4. ফর্ম্যাট করার অর্থ সমস্ত পরিবর্তনশীলগুলিতে '.ToString' এ অন্তর্নিহিত কলগুলি যা পাঠযোগ্যতার পক্ষে ভাল good
  5. "ইফেক্টিভ সি #" অনুসারে। নেট 'রাইটলাইন' এবং 'ফর্ম্যাট' প্রয়োগগুলি গণ্ডগোলিত হয়, তারা সমস্ত মানের ধরণের অটোবক্স করে (যা খারাপ)। "কার্যকর সি #" সম্পাদন করার পরামর্শ দেয় '। টুস্ট্রিং' স্পষ্টভাবে কল করে, কোন আইএমএইচও বোগাস ( জেফের পোস্টিং দেখুন )
  6. এই মুহুর্তে, সংকলক দ্বারা বিন্যাসের ধরণের ইঙ্গিতগুলি পরীক্ষা করা হয় না, যার ফলে রানটাইম ত্রুটি হয়। তবে এটি ভবিষ্যতের সংস্করণগুলিতে সংশোধন করা যেতে পারে।

4

আমি পঠনযোগ্যতার ভিত্তিতে বেছে নিই। ভেরিয়েবলের চারপাশে যখন কিছু পাঠ্য থাকে তখন আমি ফর্ম্যাট বিকল্পটি পছন্দ করি। এই উদাহরণে:

Console.WriteLine("User {0} accessed {1} on {2}.", 
                   user.Name, fileName, timestamp);

পরিবর্তনশীল নাম ছাড়াই আপনি অর্থটিও বুঝতে পারেন, তবে উপসংহারটি কোট এবং + লক্ষণগুলির সাথে বিশৃঙ্খলাযুক্ত এবং আমার চোখগুলি বিভ্রান্ত করে:

Console.WriteLine("User " + user.Name + " accessed " + fileName + 
                  " on " + timestamp + ".");

(আমি মাইকের উদাহরণ ধার করেছি কারণ আমি এটি পছন্দ করি)

যদি ভেরিয়েবলের নাম ছাড়া বিন্যাসের স্ট্রিংটির অর্থ খুব বেশি না ঘটে তবে আমাকে কনক্যাট ব্যবহার করতে হবে:

   Console.WriteLine("{0} {1}", p.FirstName, p.LastName);

বিন্যাস বিকল্পটি আমাকে ভেরিয়েবলের নামগুলি পড়তে এবং সংশ্লিষ্ট সংখ্যায় ম্যাপ করে makes কনক্যাট বিকল্পটির প্রয়োজন নেই। আমি এখনও উদ্ধৃতি এবং + চিহ্নগুলি দ্বারা বিভ্রান্ত হয়ে পড়েছি তবে বিকল্পটি আরও খারাপ। রুবি?

   Console.WriteLine(p.FirstName + " " + p.LastName);

পারফরম্যান্স অনুসারে, আমি প্রত্যাশা করি যে বিন্যাসের বিকল্পটি ধীরে ধীরে কমক্যাট হবে, যেহেতু ফর্ম্যাটের জন্য স্ট্রিংটিকে বিশ্লেষণ করতে হবে । আমি নির্দেশ এই ধরনের নিখুত থাকার মনে করতে পারছি না, কিন্তু যদি আমি করেছিলাম, আমি তাকান চাই stringমত পদ্ধতি Concat()এবং Join()

বিন্যাস সহ অন্যান্য সুবিধা হ'ল বিন্যাসের স্ট্রিংটি একটি কনফিগারেশন ফাইলে রাখা যেতে পারে। ত্রুটি বার্তা এবং ইউআই পাঠ্য সহ খুব সহজ।


4

আমি স্ট্রিং.ফর্ম্যাটটি ব্যবহার করব, তবে সংস্থান ফাইলগুলিতে আমারও ফর্ম্যাট স্ট্রিং থাকবে যাতে এটি অন্য ভাষার জন্য স্থানীয়করণ করা যায়। একটি সাধারণ স্ট্রিং কনক্যাট ব্যবহার করা আপনাকে এটি করতে দেয় না। স্পষ্টতই যদি আপনার কখনও সেই স্ট্রিংটিকে স্থানীয়করণের প্রয়োজন হয় না, এটি ভাবার কারণ নয়। এটি স্ট্রিংটি কীসের উপর নির্ভর করে।

যদি এটি ব্যবহারকারীর কাছে প্রদর্শিত হয়, আমি স্ট্রিং ব্যবহার করব For ফর্ম্যাটটি প্রয়োজন হলে আমি স্থানীয়করণ করতে পারি - এবং এফএক্সকপ আমার জন্য এটি বানান পরীক্ষা করবে, কেবলমাত্র ক্ষেত্রে)

এতে যদি সংখ্যা বা অন্য কোনও স্ট্রিং-এর জিনিস (যেমন তারিখ) থাকে তবে আমি স্ট্রিং.ফর্ম্যাট ব্যবহার করব কারণ এটি আমাকে ফর্ম্যাটিংয়ের উপর আরও নিয়ন্ত্রণ দেয় ।

যদি এটি এসকিউএল এর মতো কোনও কোয়েরি তৈরির জন্য হয় তবে আমি লিনক ব্যবহার করব ।

যদি কোনও লুপের অভ্যন্তরে স্ট্রিং সংশ্লেষের জন্য , আমি স্ট্রিংবিল্ডার ব্যবহার করব করার জন্য পারফরম্যান্স সমস্যা থেকে বাঁচতে ।

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


3

যদি আপনি এমন কোনও কিছু নিয়ে পড়েন যা পড়া সহজ হয় (এবং এটি সর্বাধিক কোড) তবে আমি অপারেটরের ওভারলোড সংস্করণটি UNLESS এর সাথে লেগে থাকব:

  • কোডটি কয়েক মিলিয়ন বার কার্যকর করা দরকার
  • আপনি প্রচুর কনটাক্ট করছেন (এক টনের চেয়ে 4 টির বেশি)
  • কোডটি কমপ্যাক্ট ফ্রেমওয়ার্কের দিকে লক্ষ্যযুক্ত

এই পরিস্থিতিতে অন্তত দুটি পরিস্থিতিতে আমি তার পরিবর্তে স্ট্রিংবিল্ডার ব্যবহার করব।


3

যদি আপনি ফলাফলটি স্থানীয়করণের উদ্দেশ্যে নিয়ে থাকেন তবে স্ট্রিং.ফর্ম্যাটটি অপরিহার্য কারণ বিভিন্ন প্রাকৃতিক ভাষায় একই ক্রমে ডেটা নাও থাকতে পারে।


2

আমি মনে করি এটি আউটপুটটি কতটা জটিল তা নির্ভর করে depends আমি যে সময়ে যে পরিস্থিতিটি সবচেয়ে ভাল কাজ করে তা বেছে নেওয়ার ঝোঁক।

কাজের উপর ভিত্তি করে সঠিক সরঞ্জামটি চয়ন করুন: ডি যাকে পরিষ্কার দেখায়!


2

আমি দ্বিতীয়টিকেও পছন্দ করি তবে এই অবস্থানটি সমর্থন করার জন্য আমার কাছে এখন কোনও যুক্তিযুক্ত যুক্তি নেই।


2

সুন্দর!

সম্প্রতি যোগ করা

        s.Start();
        for (var i = 0; i < n; i++)
            result = string.Concat(p.FirstName, " ", p.LastName);
        s.Stop();
        ceElapsedMilliseconds = s.ElapsedMilliseconds;
        ceElapsedTicks = s.ElapsedTicks;
        s.Reset();

এবং এটি আরও দ্রুততর (আমার ধারণা স্ট্রিং C কনক্যাটকে উভয় উদাহরণে ডাকা হয়, তবে প্রথমটির কোনও একটির জন্য অনুবাদ প্রয়োজন)।

1000000 x result = string.Format("{0} {1}", p.FirstName, p.LastName); took: 249ms - 3571621 ticks
1000000 x result = (p.FirstName + " " + p.LastName); took: 65ms - 944948 ticks
1000000 x result = string.Concat(p.FirstName, " ", p.LastName); took: 54ms - 780524 ticks

2
অপারেটর-ভিত্তিক স্ট্রিং কনটেনটেশনগুলি কল করতে সংকলক দ্বারা অনুবাদ করা হওয়ায় এটি ঠিক একই পরিমাণ সময় নেয় string.Concat(...)। এটি সংকলনের সময় করা হয় তাই রান-টাইম পারফরম্যান্সে এর কোনও প্রভাব নেই। আপনি যদি একাধিকবার আপনার পরীক্ষা পরিচালনা করেন বা বড় টেস্টের নমুনায় চালিত করেন তবে দেখবেন সেগুলি অভিন্ন।
অ্যালন গুরালেনেক

2

যেহেতু আমি মনে করি না যে উত্তরগুলি এখানে সমস্ত কিছু কভার করে, তাই আমি এখানে একটি ছোট সংযোজন করতে চাই।

Console.WriteLine(string format, params object[] pars) কল string.Format । '+' এর সাহায্যে স্ট্রিং কনকেন্টেশন বোঝায়। আমি মনে করি না এটি সর্বদা শৈলীর সাথে করা উচিত; আমি যে প্রসঙ্গে রয়েছি তার উপর নির্ভর করে আমি দুটি শৈলীর মিশ্রণ করতে চাই।

সংক্ষিপ্ত উত্তর

আপনি যে সিদ্ধান্তটির মুখোমুখি হচ্ছেন তা হ'ল স্ট্রিং বরাদ্দের সাথে। আমি এটিকে সহজ করার চেষ্টা করব।

বলুন তো আছে

string s = a + "foo" + b;

আপনি যদি এটি কার্যকর করেন তবে এটি নীচে মূল্যায়ন করবে:

string tmp1 = a;
string tmp2 = "foo" 
string tmp3 = concat(tmp1, tmp2);
string tmp4 = b;
string s = concat(tmp3, tmp4);

tmpএখানে প্রকৃতপক্ষে কোনও স্থানীয় পরিবর্তনশীল নয়, তবে এটি জেআইটির পক্ষে একটি অস্থায়ী (এটি আইএল স্ট্যাকের উপরে চাপ দেওয়া)। যদি আপনি স্ট্যাকের উপর একটি স্ট্রিং চাপান (যেমন ldstrআক্ষরিক জন্য আইএল), আপনি স্ট্যাকের উপর একটি স্ট্রিং পয়েন্টার একটি রেফারেন্স রাখেন।

যে মুহুর্তে আপনি ফোন করবেন concat এই রেফারেন্সটি একটি সমস্যায় পরিণত হয়, কারণ কোনও স্ট্রিং রেফারেন্স উপলব্ধ নেই যা উভয় স্ট্রিং রয়েছে। এর অর্থ হল। নেটকে মেমরির একটি নতুন ব্লক বরাদ্দ করতে হবে এবং তারপরে এটি দুটি স্ট্রিং দিয়ে পূরণ করুন with এই সমস্যা হওয়ার কারণ, বরাদ্দ তুলনামূলকভাবে ব্যয়বহুল।

যা প্রশ্নটিতে পরিবর্তন করে: আপনি কীভাবে concatঅপারেশন সংখ্যা হ্রাস করতে পারেন ?

সুতরাং, মোটামুটি উত্তরটি হল: string.Format> 1 কনক্টের জন্য, '+' 1 কনকটের জন্য ঠিক কাজ করবে। এবং যদি আপনি মাইক্রো-পারফরম্যান্স অপ্টিমাইজেশানগুলি করার বিষয়ে চিন্তা না string.Formatকরেন তবে সাধারণ ক্ষেত্রে ঠিক কাজ করবে।

সংস্কৃতি সম্পর্কে একটি নোট

এবং তারপরে সংস্কৃতি বলে কিছু আছে ...

string.Formatআপনাকে CultureInfoআপনার ফর্ম্যাটিংয়ে ব্যবহার করতে সক্ষম করে । একটি সাধারণ অপারেটর '+' বর্তমান সংস্কৃতি ব্যবহার করে।

আপনি যদি ফাইল ফর্ম্যাট এবং f.ex লিখছেন তবে এটি বিশেষত একটি গুরুত্বপূর্ণ মন্তব্য is doubleমানগুলি যা আপনি একটি স্ট্রিংয়ে 'যুক্ত' করেন। বিভিন্ন মেশিনে, আপনি যদি string.Formatস্পষ্টভাবে ব্যবহার না করেন তবে আপনি বিভিন্ন স্ট্রিং দিয়ে শেষ করতে পারেন CultureInfo

F.ex. আপনি যদি একটি 'পরিবর্তন করেন তবে কী হবে তা বিবেচনা করুন।' আপনার 'কমা-বিচ্ছিন্ন-মান ফাইলটি লেখার সময়', 'এর জন্য ... ডাচ ভাষায় দশমিক বিভাজক একটি কমা, সুতরাং আপনার ব্যবহারকারী সম্ভবত একটি' মজার 'চমক পেতে পারেন।

আরও বিস্তারিত উত্তর

আপনি যদি স্ট্রিংয়ের সঠিক আকারটি আগে জানেন না তবে আপনি যে বাফার ব্যবহার করেন তাতে সামগ্রিকভাবে নীতি ব্যবহার করা ভাল। স্ল্যাক স্পেসটি প্রথমে পূরণ করা হয়, যার পরে ডেটা অনুলিপি করা হয়।

ক্রমবর্ধমান মানে মেমরির একটি নতুন ব্লক বরাদ্দ করা এবং নতুন বাফারে পুরানো ডেটা অনুলিপি করা। মেমরির পুরানো ব্লকটি তখন মুক্তি পেতে পারে। আপনি এই মুহুর্তে নীচের লাইনটি পান: বর্ধন একটি ব্যয়বহুল ক্রিয়াকলাপ।

এটি করার সবচেয়ে ব্যবহারিক উপায় হ'ল একটি সামগ্রিক নীতি ব্যবহার করা। সর্বাধিক সাধারণ নীতি হ'ল ২ এর ক্ষমতায় থাকা বাফারগুলিকে সামগ্রিকভাবে চালিত করা Of অবশ্যই, আপনাকে এটির তুলনায় কিছুটা স্মার্ট করতে হবে (যেহেতু এটি ইতিমধ্যে যদি আপনার জানা থাকে যে আপনার যদি 128 টি অক্ষর প্রয়োজন তবে এটি 1,2,4,8 থেকে বাড়ার কোনও অর্থ হয় না makes ) কিন্তু আপনি ছবি পেতে. নীতিটি নিশ্চিত করে যে আমি উপরে বর্ণিত ব্যয়বহুল ক্রিয়াকলাপগুলির খুব বেশি দরকার নেই।

StringBuilderএকটি শ্রেণি যা মূলত দুটি এর ক্ষমতার অন্তর্নিহিত বাফারকে সামগ্রিকভাবে গড়ে তোলে। ফণা অধীন string.Formatব্যবহার StringBuilderকরে।

এটি আপনার সিদ্ধান্তকে সামগ্রিকভাবে-ও-সংযোজন (-মল্টিপল) (ডাব্লু / ডাব্লু সংস্কৃতি) বা কেবল বরাদ্দ-এবং-সংযোজনের মধ্যে একটি বেসিক বাণিজ্য বন্ধ করে দেয়।


1

ব্যক্তিগতভাবে, দ্বিতীয়টি যা আপনি ব্যবহার করছেন তা প্রত্যক্ষ ক্রমে এটি আউটপুট হবে Where প্রথমটির সাথে আপনাকে সঠিক ভেরের সাথে {0} এবং {1 match মেলাতে হবে, যা গণ্ডগোল করা সহজ।

কমপক্ষে এটি সি ++ স্প্রিন্টফের মতো খারাপ নয় যেখানে আপনি ভেরিয়েবল টাইপটি ভুল পেলে পুরো জিনিসটি ফুরিয়ে যাবে।

এছাড়াও, যেহেতু দ্বিতীয়টি সমস্ত ইনলাইন এবং এটি সমস্ত {0} জিনিসের জন্য কোনও অনুসন্ধান এবং প্রতিস্থাপন করতে হবে না, তবে পরবর্তীটি আরও দ্রুত হওয়া উচিত ... যদিও আমি নিশ্চিতভাবে জানি না।


1

আমি আসলে প্রথমটি পছন্দ করি কারণ যখন পাঠ্যের সাথে অনেকগুলি ভেরিয়েবল মিলিত হয় তখন আমার কাছে এটি পড়া সহজ মনে হয়। এছাড়াও, স্ট্রিংটি ব্যবহার করার সময় উদ্ধৃতিগুলি ব্যবহার করা আরও সহজ For ফর্ম্যাট (), আহ, ফর্ম্যাট। এখানে শালীন বিশ্লেষণ স্ট্রিং কনটেন্টেশন এর ।


1

আমি সর্বদা স্ট্রিংয়ে গিয়েছি For নাথানের উদাহরণের মতো ভেরিয়েবলগুলিতে ফর্ম্যাটগুলি সঞ্চয় করতে সক্ষম হওয়া একটি দুর্দান্ত সুবিধা। কিছু ক্ষেত্রে আমি একটি পরিবর্তনশীল সংযোজন করতে পারি তবে একবারের বেশি 1 টি ভেরিয়েবল কনটেমেটেড হচ্ছে আই ফর্ম্যাটিংটি ব্যবহার করার জন্য রিফেক্টর।


1

ওহ, এবং কেবল সম্পূর্ণতার জন্য, নীচেরটি কয়েকটি সাধারণ টানটান তুলনায় দ্রুত গতিযুক্ত:

Console.WriteLine(String.Concat(p.FirstName," ",p.LastName));

1

প্রথমটি (ফর্ম্যাট) আমার কাছে আরও ভাল দেখাচ্ছে। এটি আরও পঠনযোগ্য এবং আপনি অতিরিক্ত অস্থায়ী স্ট্রিং অবজেক্ট তৈরি করছেন না।


1

আমি আগ্রহী ছিলাম যেখানে স্ট্রিংবিল্ডার এই পরীক্ষাগুলি নিয়ে দাঁড়িয়েছিলেন with নীচে ফলাফল ...

class Program {
   static void Main(string[] args) {

      var p = new { FirstName = "Bill", LastName = "Gates" };

      var tests = new[] {
         new { Name = "Concat", Action = new Action(delegate() { string x = p.FirstName + " " + p.LastName; }) },
         new { Name = "Format", Action = new Action(delegate() { string x = string.Format("{0} {1}", p.FirstName, p.LastName); }) },
         new { Name = "StringBuilder", Action = new Action(delegate() {
            StringBuilder sb = new StringBuilder();
            sb.Append(p.FirstName);
            sb.Append(" ");
            sb.Append(p.LastName);
            string x = sb.ToString();
         }) }
      };

      var Watch = new Stopwatch();
      foreach (var t in tests) {
         for (int i = 0; i < 5; i++) {
            Watch.Reset();
            long Elapsed = ElapsedTicks(t.Action, Watch, 10000);
            Console.WriteLine(string.Format("{0}: {1} ticks", t.Name, Elapsed.ToString()));
         }
      }
   }

   public static long ElapsedTicks(Action ActionDelg, Stopwatch Watch, int Iterations) {
      Watch.Start();
      for (int i = 0; i < Iterations; i++) {
         ActionDelg();
      }
      Watch.Stop();
      return Watch.ElapsedTicks / Iterations;
   }
}

ফলাফল:

কনক্যাট: 406 টিক্স
কনক্যাট: 356 টিক্স
কনক্যাট: 411 টিক্স
কনক্যাট: 299 টিক্স
কনক্যাট: 266 টিক্স
ফর্ম্যাট: 5269 টিক্স
ফর্ম্যাট: 954 টিক্স
ফর্ম্যাট: 1004 টিক্স
ফর্ম্যাট: 984 টিক্স
ফর্ম্যাট: 974 টিক্স
স্ট্রিংবিল্ডার: 629 টিক্স
স্ট্রিংবিল্ডার: 484 টিক্স
স্ট্রিংবিল্ডার: 482 টিক্স
স্ট্রিংবিল্ডার: 508 টিক্স
স্ট্রিংবিল্ডার: 504 টিক্স

1

এমসিএসডি প্রিপ উপাদান অনুসারে, খুব অল্প সংখ্যক কনটেন্টেশন (সম্ভবত 2 থেকে 4) নিয়ে কাজ করার সময় মাইক্রোসফ্ট + অপারেটর ব্যবহার করার পরামর্শ দেয়। আমি এখনও নিশ্চিত না কেন, তবে এটি বিবেচনা করার মতো বিষয়।

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