PDA

View Full Version : عملکرد دستور compare



emad_67
چهارشنبه 03 مرداد 1386, 11:26 صبح
می خواستم ببینم که دستور compare برای مقایسه 2 رشته بر چه مبنایی مقایسه رو انجام میده مثلا وقتی من مینویسم


int x = String.Compare("a", "A");
MessageBox.Show(x.ToString());

مقدار -1 بر میگرده چرا؟
اگه مقایسه بر حسب کد های اسکی صورت بگیره که کد اسکی "a" بزرگتر از "A" است پس باید مقدار 1 بر گرده پس چرا -1 بر میگرده؟

hdv212
چهارشنبه 03 مرداد 1386, 13:15 عصر
متد Compare مربوط به کلاس String سه مقدار برمیگردونه که -1 برای زمانی هست که رشته ی اول از رشته ی دوم کوچیکتره(مثل مال شما)، مقدار 0 هم مال زمانی هست که دو رشته با هم مساوی باشن، مقدار 1 هم مال زمانی هست که رشته ی دوم از رشته ی اولی بزرگتر باشه، در ضمن این متد Case-Sensitive است یعنی به بزرگی و کوچی حروف حساسه.
موفق باشید.

emad_67
چهارشنبه 03 مرداد 1386, 13:47 عصر
خوب اینایی که گفتین رو من میدونم من میخوام بدونم که مقایسه بر مبنای کد اسکی های کاراکتر ها صورت میگیره یا نه؟ و چرا "a" کوچکتر از "A" است؟

once4ever
چهارشنبه 03 مرداد 1386, 14:19 عصر
در ضمن این متد Case-Sensitive است
برای اینکه حروف بزرگ کوچیک حساس

emad_67
چهارشنبه 03 مرداد 1386, 14:57 عصر
خوب اینایی که میگین همش درست منم میدونم ولی میخوام اینو بدونم که مقایسه بر مبنای کد اسکی های کاراکتر ها صورت میگیره یا نه؟ چون کد اسکی "َa" برابر 97 و "A" برابر 65 است پس چرا "َa" کوچکتر از "A" است؟

emad_67
چهارشنبه 03 مرداد 1386, 19:17 عصر
بلاخره یه نفر نبود بگه دقیقا که چرا اینجوری میشه؟

mehdi.mousavi
پنج شنبه 04 مرداد 1386, 00:57 صبح
خوب اینایی که میگین همش درست منم میدونم ولی میخوام اینو بدونم که مقایسه بر مبنای کد اسکی های کاراکتر ها صورت میگیره یا نه؟ چون کد اسکی "َa" برابر 97 و "A" برابر 65 است پس چرا "َa" کوچکتر از "A" است؟


سلام.
سوالتون فوق العاده جالب هستش. ما دو جور مقایسه String در C# داریم:

الف. Dictionary-based String Comparison
ب. ASCII-based String Comparison

در روش اول، حروف کوچک جلوتر از حروف بزرگتر قرار میگیرن و کاری با جدول ASCII نداره. بعنوان مثال، همونطور که خودتون هم اشاره کردین، حرف a علیرغم داشتن کد 97 جلوتر از حرف A با کد 65 قرار میگیره برای اینکه تو زبان انگلیسی هم همینطوره. اما در روش دوم، مقایسه بر اساس جدول ASCII انجام میشه، و حروف کوچک و بزرگ با توجه به جدول ASCII با هم مقایسه میشن. برای روش اول از String.Compare و برای مقایسه به روش دوم از String.CompareOrdinal استفاده میشه. در نتیجه مقدار بازگشتی String.CompareOrdinal("a", "A"); یه عدد مثبته، چون 97 بزرگتر از 65 هستش.

emad_67
پنج شنبه 04 مرداد 1386, 08:42 صبح
خیلی خیلی ممنون از جوابتون


در روش اول، حروف کوچک جلوتر از حروف بزرگتر قرار میگیرن و کاری با جدول ASCII نداره. بعنوان مثال، همونطور که خودتون هم اشاره کردین، حرف a علیرغم داشتن کد 97 جلوتر از حرف A با کد 65 قرار میگیره برای اینکه تو زبان انگلیسی هم همینطوره.

شما گفتین که با توجه به روش اول حرف کوچک جلوتر از حرف بزرگ قرار میگیرن اگه اینطور باشه اون کد من


int x = String.Compare("a", "A");
MessageBox.Show(x.ToString());

باید مقدار 1 برگردونه مثل روش دوم . اصلا منظور از جلوتر بودن حرف کوچک نسبت به حرف بزرگ , بزرگتر بودن اونا هست؟

mehdi.mousavi
پنج شنبه 04 مرداد 1386, 09:40 صبح
خیلی خیلی ممنون از جوابتون

شما گفتین که با توجه به روش اول حرف کوچک جلوتر از حرف بزرگ قرار میگیرن اگه اینطور باشه اون کد من


int x = String.Compare("a", "A");
MessageBox.Show(x.ToString());
باید مقدار 1 برگردونه مثل روش دوم . اصلا منظور از جلوتر بودن حرف کوچک نسبت به حرف بزرگ , بزرگتر بودن اونا هست؟


خواهش میکنم. منظورم از جلوتر بودن این بود که بعد از Sort شدن، جلوتر قرار میگیره. یعنی چون "a" حرف کوچک هستش، زودتر از "A" که حرف بزرگ هستش ظاهر میشه، و در نتیجه جواب اون مقایسه یک عدد منفی هستش. در صورتیکه در CompareOrdinal کد ASCII دو حرف مقایسه میشن و ...

دقت کنید که هیچوقت نباید انتظار داشته باشید که نتیجه این مقایسه ها 1 یا -1 باشه. منظورم این هستش که مبدا مقایسه مقدار بازگشتی عدد صفر هست. یعنی اگر

int x = String.Compare("a", "A");

رو در نظر بگیریم، برای اینکه بفهمیم کدومیک از دو رشته بزرگتر هستن، باید کد زیر رو بنویسم:


if x > 0
"a" is greater than "A"

if x < 0
"a" is less than "A"

if x == 0
"a" equals "A"

در صورتیکه در این پست عدد -1 و +1 بعنوان مقادیر بازگشتی این تابع ذکر شده که صحیح نیست. بعنوان مثال کد زیر مقدار 32 رو بر میگردونه:


String.CompareOrdinal("a", "A");در نتیجه مثبت، منفی یا صفر بودن مقدار بازگشتی مهم هستش.