در تپش این هفته، ماجرای فریب و تعرض در پوشش عرفانهای دروغین و رمالی را بررسی کردیم
public static string ReverseArray(string text){
char[] array = text.ToCharArray();
Array.Reverse(array);
return (new string(array));}
روش دوم: در این روش رشته را با استفاده از کلاس StringBuilder معکوس میکنیم. در این عناصر رشته را بهصورت معکوس با استفاده از اندیس آنها را در یک کلاس StringBuilder ریخته و مقدار رشته ذخیره شده در شی ساخته شده از StringBuilder را بر میگردانیم. کد مربوط به این روش در زیر آورده شده است.
public static string ReverseSB(string text){
StringBuilder builder = new StringBuilder(text.Length);{
builder.Append(text[i]);}
return builder.ToString();
}
بسیار خب یک سوالی ممکن است که در اینجا بهوجود بیاید، این است که چرا از کلاس StringBuilder استفاده کردیم در صورتی که میتوانستیم از یک متغیر رشتهای استفاده کنیم؟ به فرض کنید یک رشته را به یک متغیر رشتهای وصل کنیم. در این حالت 3 رشته در حافظه داریم: نخست رشته اول، رشتهای که میخواهیم به رشته اصلی بچسبانیم و در نهایت رشته حاصل از عمل وصل شدن. دلیل این اتفاق این است که کلاس رشته در #C یک کلاس Imutable است، اینکه کلاس Imutable چیست، خودش بحثی جداست که از حوصله این مطلب خارج است. روش سوم استفاده از اشارهگر است، در این روش ابتدا کاراکتر اول را در متغییر pStart که یک اشارهگر به یک کاراکتر است، ذخیره میکنیم. وکاراکتر آخر را در pEnd ذخیره میکنیم و سپس در یک حلقه که به نصف اندازه یک رشته اجرا میشود، خانه آخر را با خانه ابتدایی عوض میکنیم و سپس رشته را بر میگردانیم.
public static unsafe string
ReverseUnsafe(string text){
fixed (char* pText = text){
char* pStart = pText;
char* pEnd = pText + text.Length - 1;
for (int i = text.Length / 2; i »= 0; i--){
char temp = *pStart;
*pStart++ = *pEnd;
*pEnd-- = temp;}
return text;}
}
در روش چهارم با استفاده از عملگر Xor رشته را معکوس میکنیم. خانه آخر را با خانه اول Xor میکنیم و نتیجه را در خانه اول قرار میدهیم و سپس خانه اول را با خانه آخر Xor میکنیم و نتیجه را در خانه آخر قرار میدهیم و سپس خانه اول را دوباره با خانه آخر XOR میکنیم و نتیجه را در خانه اول قرار میدهیم این عمل را تا از ابتدای رشته تا آخر آن انجام میدهیم.
public static string ReverseXor(string s){
char[] charArray = s.ToCharArray();
int len = s.Length - 1;
for (int i = 0; i « len; i++, len--){
charArray[i] ^= charArray[len];
charArray[len] ^= charArray[i];
charArray[i] ^= charArray[len];}
return new string(charArray);
}
بسیار خب حال 4 روش داریم که با آنها می توانیم یک رشته را برعکس کنیم حال بررسی کنیم که کدام روش بهتر و بهینهتر است.
برای تستکردن اینکه کدام روش بهتر است از کد زیر استفاده میکنیم:
static void Benchmark (string description, StringDelegate d, int times, string text){
Stopwatch sw = new Stopwatch();
sw.Start();
for (int j = 0; j « times; j++){
d(text);}
sw.Stop();
Console.WriteLine(«{0} Ticks {1} : called {2} times.», sw.ElapsedMilliseconds, description, times);
}
بعد از مقایسه نتایج بدست آمده از آزمایش به این نتیجه میرسیم که برای رشتههای متنی کوچک مثلا شامل 1000 کاراکتر استفاده از کلاس Array سودمندتر است و زمان کمتری طول میکشد که یک رشته را برعکس کند. بعد از آن استفاده از یک روش اشارهگر برای رشتههای متنی بزرگ مثلا شامل 10000 کاراکتر استفاده از اشارهگر مفید است و سپس استفاده از کلاس Array بهتر است. نتیجهای که از این مقایسه حاصل میشود استفاده از کلاس Array بهینهتر است. دلیل اینکار این است که استفاده از اشارهگرها خطرناک است و ممکن است بعدها و در سیستمهای مختلف مشکل ایجاد شود. ولی اگر به عنوان برنامهنویس تضمین میکنید که کد شما بدون خطا اجرا میشود و میتوانید درست از آن استفاده کنید، استفاده از روش اشارهگر خیلی بهتر و به صرفهتر است.
سورس کد این مقاله از آدرس زیر قابل دریافت است:
http://dotnetdeveloper.persiangig.com/Code%20Snippet/ReverseString.cs
امیربهاالدین سبطالشیخ
در تپش این هفته، ماجرای فریب و تعرض در پوشش عرفانهای دروغین و رمالی را بررسی کردیم
گزارش «جامجم» درباره دستاوردهای زبان فارسی در گفتوگو با برخی از چهرههای ادب معاصر
معاون وزیر بهداشت: