.NET কোর 2.1 দিয়ে শুরু করে একটি ব্যবহার করে স্ট্রিংটি বিপরীত করার একটি নতুন উপায় রয়েছে string.Create পদ্ধতিটি ।
নোট করুন যে এই সমাধানটি ইউনিকোডের সাথে সংযুক্ত অক্ষরগুলি ইত্যাদি সঠিকভাবে পরিচালনা করে না, কারণ "লেস মাইস \ u0301rables" "সেলবার selসিম সেল" তে রূপান্তরিত হবে। আরও ভাল সমাধানের জন্য অন্যান্য উত্তর ।
public static string Reverse(string input)
{
return string.Create<string>(input.Length, input, (chars, state) =>
{
state.AsSpan().CopyTo(chars);
chars.Reverse();
});
}
এটি মূলত inputএকটি নতুন স্ট্রিং- এর অক্ষরগুলি অনুলিপি করে এবং নতুন স্ট্রিংটিকে জায়গায় রেখে দেয়।
কেন string.Createদরকারী?
আমরা যখন বিদ্যমান অ্যারে থেকে স্ট্রিং তৈরি করি তখন একটি নতুন অভ্যন্তরীণ অ্যারে বরাদ্দ করা হয় এবং মানগুলি অনুলিপি করা হয়। অন্যথায়, কোনও স্ট্রিং তৈরির পরে (নিরাপদ পরিবেশে) পরিবর্তন করা সম্ভব হবে। এটি হ'ল, নিম্নলিখিত স্নিপেটে আমাদের দু'বার দৈর্ঘ্যের অ্যারে দুবার বরাদ্দ করতে হবে, একটি বাফার হিসাবে এবং একটি স্ট্রিংয়ের অভ্যন্তরীণ অ্যারে হিসাবে।
var chars = new char[10];
// set array values
var str = new string(chars);
string.Createমূলত স্ট্রিং তৈরির সময় আমাদের অভ্যন্তরীণ অ্যারে হেরফের করতে দেয়। এটি হ'ল, আমাদের আর বাফার দরকার নেই এবং তাই সেই চারটি অ্যারের বরাদ্দ এড়াতে পারি।
স্টিভ গর্ডন এখানে আরও বিস্তারিতভাবে এটি লিখেছেন । এমএসডিএন নিয়ে একটি নিবন্ধও রয়েছে ।
কিভাবে ব্যবহার করবেন string.Create?
public static string Create<TState>(int length, TState state, SpanAction<char, TState> action);
পদ্ধতিটি তিনটি পরামিতি নেয়:
- স্ট্রিংটির দৈর্ঘ্য তৈরি করতে,
- আপনি নতুন তথ্যটি নতুনভাবে তৈরি করতে ডেটা ব্যবহার করতে চান,
- এবং একটি প্রতিনিধি যা ডেটা থেকে চূড়ান্ত স্ট্রিং তৈরি করে, যেখানে প্রথম প্যারামিটারটি
charনতুন স্ট্রিংয়ের অভ্যন্তরীণ অ্যারেতে নির্দেশ করে এবং দ্বিতীয়টি হ'ল আপনি যে ডেটা (রাষ্ট্র) পাস করেছেন string.Create।
প্রতিনিধিটির ভিতরে আমরা উল্লেখ করতে পারি যে কীভাবে ডেটা থেকে নতুন স্ট্রিং তৈরি হয়। আমাদের ক্ষেত্রে, আমরা কেবলমাত্র Spanনতুন স্ট্রিং দ্বারা ব্যবহৃত ইনপুট স্ট্রিংয়ের অক্ষরগুলি অনুলিপি করি । তারপরে আমরা বিপরীত করি Spanএবং তাই পুরো স্ট্রিংটি বিপরীত হয়।
benchmarks
স্বীকৃত উত্তরের সাথে আমার স্ট্রিংটিকে বিপরীত করার প্রস্তাবিত পদ্ধতির তুলনা করতে, আমি বেঞ্চমার্কডটনেট ব্যবহার করে দুটি মানদণ্ড লিখেছি।
public class StringExtensions
{
public static string ReverseWithArray(string input)
{
var charArray = input.ToCharArray();
Array.Reverse(charArray);
return new string(charArray);
}
public static string ReverseWithStringCreate(string input)
{
return string.Create(input.Length, input, (chars, state) =>
{
state.AsSpan().CopyTo(chars);
chars.Reverse();
});
}
}
[MemoryDiagnoser]
public class StringReverseBenchmarks
{
private string input;
[Params(10, 100, 1000)]
public int InputLength { get; set; }
[GlobalSetup]
public void SetInput()
{
// Creates a random string of the given length
this.input = RandomStringGenerator.GetString(InputLength);
}
[Benchmark(Baseline = true)]
public string WithReverseArray() => StringExtensions.ReverseWithArray(input);
[Benchmark]
public string WithStringCreate() => StringExtensions.ReverseWithStringCreate(input);
}
আমার মেশিনে ফলাফল এখানে:
| Method | InputLength | Mean | Error | StdDev | Gen 0 | Allocated |
| ---------------- | ----------- | -----------: | ---------: | --------: | -----: | --------: |
| WithReverseArray | 10 | 45.464 ns | 0.4836 ns | 0.4524 ns | 0.0610 | 96 B |
| WithStringCreate | 10 | 39.749 ns | 0.3206 ns | 0.2842 ns | 0.0305 | 48 B |
| | | | | | | |
| WithReverseArray | 100 | 175.162 ns | 2.8766 ns | 2.2458 ns | 0.2897 | 456 B |
| WithStringCreate | 100 | 125.284 ns | 2.4657 ns | 2.0590 ns | 0.1473 | 232 B |
| | | | | | | |
| WithReverseArray | 1000 | 1,523.544 ns | 9.8808 ns | 8.7591 ns | 2.5768 | 4056 B |
| WithStringCreate | 1000 | 1,078.957 ns | 10.2948 ns | 9.6298 ns | 1.2894 | 2032 B |
আপনি দেখতে পাচ্ছেন যে, ReverseWithStringCreateআমরা ReverseWithArrayপদ্ধতি দ্বারা ব্যবহৃত মেমরির অর্ধেক বরাদ্দ করি ।