مقایسه رشته‌ها در #C

سه شنبه 8 بهمن 1398

در این مقاله می‌خواهیم به رشته‌ها (string) بپردازیم. در اینجا خواهید آموخت کدام روش در C# برای بررسی اینکه آیا دو رشته با هم برابر هستند یا نه بهترین روش است.

مقایسه رشته‌ها در #C

شما می‌توانید برابری رشته‌ها را با دو روش زیر بررسی کنید:

با استفاده از عملگر ==

با استفاده از متد Equals()

نکته: سی‌شارپ همچنین شامل متدهای String.Compare() و String.CompareTo() است، اما این متدها به معنای مقایسه تساوی رشته نیستند، بلکه منظور بررسی موقعیت‌های نسبی رشته‌ها به ترتیب مرتب‌شده است. در اینجا ما فقط می‌خواهیم برابری دو رشته را بررسی کنیم و نه موقعیت مرتب‌سازی را، بنابراین ما این مبحث را پوشش نمی‌دهیم.

بیایید سناریوهای متفاوتی را از مقایسه برابری رشته‌ها ببینیم.

مقایسه رشته‌های حساس به حروف

هر دو روش == و متد Equals() محتوای رشته‌ها را مقایسه می‌کنند. بنابراین وقتی شما رشته‌های حساس به حروف و در en culture  (فرهنگ انگلیسی) را مقایسه می‌کنید هیچ تفاوتی بین آن‌ها وجود ندارد.


string str1 = "London";
string str2 = "London";
 
str1 == str2; // true
str1.Equals(str2); // true

چه اتفاقی می‌افتد اگر یک رشته null باشد؟


string str1 = "London";
string str2 = null;

str1 == str2; // false
str1.Equals(str2); // false
str2.Equals(str1); // NullReferenceException

همانطور که در بالا مشاهده می‌کنید، اگر رشته‌ای null باشد، با عملگر == هیچ مشکلی وجود ندارد. اما فراخوانی متد Equals() بر روی null، NullReferenceException را پرتاب می‌کند. بنابراین قبل از فراخوانی متد Equals() مطمئن شوید که مقدار رشته null  نیست.

حالا مثال زیر را در مقایسه یک رشته با یک آبجکت در نظر بگیرید.


string str1 = "London";
object obj = "London";
 
str1 == obj; // true
str1.Equals( obj); // true
obj.Equals(str1); // true

بنابراین هنگام مقایسه یک رشته با یک آبجکت، نتیجه صحیح می‌دهد.

حالا بیایید سناریوی کمی پیچیده‌تری را ببینیم.


string str = "London";
StringBuilder sb = new StringBuilder("London");
object obj = sb.ToString();
 
str == obj; // false
str == sb.ToString();// true
str.Equals(obj);// true
obj.Equals(str1); //true

در مثال بالا، اگرچه مقادیر مشابه هستند، str == obj مقدار false را برمی‌گرداند. چرا؟

نوع String، overload عملگر == را اجرا می‌کند، که مقدار دو عملوند را مقایسه می‌کند. با این حال بعد از تبدیل کردن StringBuilder به object، overloadهای مختلف را فراخوانی می‌کند که رفرنس دو عملوند را مقایسه می‌کند. بنابراین str == obj نتیجه نادرستی را می‌دهد.

پس اگر در حال مقایسه رشته‌های حساس به حروف هستید، در اکثر موارد == و Equals() رفتار مشابه دارند. اما در سناریویی مانند مثال بالا، == نتیجه نادرستی می‌دهد.

مقایسه رشته‌های غیر حساس به حروف

عملگر == همیشه رشته‌های حساس به حروف را مقایسه می‌کند.


string str1 = "LONDON";
string str2 = "london";    

str1 == str2; //false

از متد Equals() برای مقایسه رشته‌های غیر حساس  به حروف با استفاده از پارامتر StringComparison استفاده کنید.


string str1 = "LONDON";
string str2 = "london";

str1.Equals(str2, StringComparison.CurrentCultureIgnoreCase); // true

همیشه قبل از فراخوانی متد Equals()، با استفاده از شرط null بودن با استفاده از عملگر ؟ مطمئن شوید که رشته null نیست.

== در مقایسه با Equals

                           

نتیجه‌گیری

اگر مطمئن هستید که نوع دو عملوند رشته است و می‌خواهید رشته‌های حساس به حروف را مقایسه کنید، هر دو نتیجه درستی را می‌دهند. با این حال، شما نوع عملوندها را نمی‌دانید و می‌خواهید رشته‌های غیرحساس به حروف را مقایسه کنید یا می‌خواهید رشته‌ها را در یک culture خاص مقایسه کنید، پس از متد Equals() استفاده کنید. فقط وقتی متد Equals() را فراخوانی می‌کنید مطمئن شوید که رشته null نیست.

ایمان مدائنی

نویسنده 1299 مقاله در برنامه نویسان
  • C#.net
  • 5k بازدید
  • 3 تشکر

کاربرانی که از نویسنده این مقاله تشکر کرده اند

در صورتی که در رابطه با این مقاله سوالی دارید، در تاپیک های انجمن مطرح کنید