আমি জানি যে নিম্নলিখিতগুলি সংবেদনশীল:
if (StringA == StringB) {
তাহলে কি এমন কোনও অপারেটর রয়েছে যা সংবেদনশীল উপায়ে দুটি স্ট্রিংয়ের তুলনা করবে?
~=সমান্তরাল সম্পর্কিত কোনও সংজ্ঞায়িত করতে বলুন ==।
আমি জানি যে নিম্নলিখিতগুলি সংবেদনশীল:
if (StringA == StringB) {
তাহলে কি এমন কোনও অপারেটর রয়েছে যা সংবেদনশীল উপায়ে দুটি স্ট্রিংয়ের তুলনা করবে?
~=সমান্তরাল সম্পর্কিত কোনও সংজ্ঞায়িত করতে বলুন ==।
উত্তর:
এটা চেষ্টা কর:
string.Equals(a, b, StringComparison.CurrentCultureIgnoreCase);
if A$=B$ then goto 10"
সবচেয়ে ভালো উপায় বর্ণের ক্ষেত্রে উপেক্ষা 2 স্ট্রিং তুলনা করতে ব্যবহার করা String.Equals স্ট্যাটিক পদ্ধতি উল্লেখ একটি পূরণবাচক ক্ষেত্রে স্ট্রিং তুলনা উপেক্ষা করি। এটি স্ট্রিংগুলি লোয়ার বা উপরের ক্ষেত্রে রূপান্তর করার এবং তার পরে তার সাথে তুলনা করার চেয়েও দ্রুততম উপায়।
আমি উভয় পদ্ধতির পারফরম্যান্স পরীক্ষা করেছি এবং অর্ডিনাল উপেক্ষা কেস স্ট্রিং তুলনা 9 গুণ বেশি দ্রুত ছিল ! এটি স্ট্রিংগুলি লোয়ার বা আপার ক্ষেত্রে রূপান্তর করার চেয়ে আরও নির্ভরযোগ্য (তুর্কি আই সমস্যাটি দেখুন)। সুতরাং সমতার জন্য স্ট্রিংগুলির তুলনা করতে সর্বদা স্ট্রিং.একুয়ালস পদ্ধতি ব্যবহার করুন :
String.Equals(string1, string2, StringComparison.OrdinalIgnoreCase);
আপনি যদি সংস্কৃতি নির্দিষ্ট স্ট্রিং তুলনা করতে চান তবে আপনি নীচের কোডটি ব্যবহার করতে পারেন:
String.Equals(string1, string2, StringComparison.CurrentCultureIgnoreCase);
দয়া করে মনে রাখবেন যে দ্বিতীয় উদাহরণটি বর্তমান সংস্কৃতির স্ট্রিং তুলনা যুক্তি ব্যবহার করে, যা এটি প্রথম উদাহরণের তুলনায় "অর্ডিনাল উপেক্ষা" এর তুলনায় ধীর করে তোলে, সুতরাং আপনার যদি কোনও সংস্কৃতির নির্দিষ্ট স্ট্রিং তুলনা যুক্তির প্রয়োজন না হয় এবং আপনি সর্বাধিক পারফরম্যান্সের পরে, "অর্ডিনাল উপেক্ষা কেস" তুলনা ব্যবহার করুন।
আরও তথ্যের জন্য, আমার ব্লগে পুরো গল্পটি পড়ুন ।
ToLowerবা ToLowerInvariant: তারা কেবল তুলনা করার জন্য মেমরি তৈরি করে এবং ইউনিকোডে নতুন অক্ষর সেট যুক্ত হওয়ার সাথে সাথে তারা ব্যর্থ হতে পারে। ToUpperঅন্যদের মধ্যে তুর্কি 'আমি' এর কারণে ব্যর্থ হয়; ToLowerভবিষ্যতে অনুরূপ কারণে ব্যর্থ হওয়ার কোনও কারণ নেই ।
ToLowerবা ToLowerInvariantপদ্ধতিগুলি ব্যবহার করার পরামর্শ দিচ্ছি না , আমি কেবল String.Equalsপদ্ধতিটি আরও দক্ষতার সাথে দেখাতে চেয়েছিলাম ।
StringComparerস্ট্যাটিক শ্রেণিতে এমন অনেকগুলি সম্পত্তি রয়েছে যা আপনি যে কোনও ধরণের কেস-সংবেদনশীলতার জন্য তুলনামূলককে ফিরিয়ে নিতে পারেন:
উদাহরণস্বরূপ, আপনি কল করতে পারেন
StringComparer.CurrentCultureIgnoreCase.Equals(string1, string2)
অথবা
StringComparer.CurrentCultureIgnoreCase.Compare(string1, string2)
এটা তোলে চেয়ে একটু ক্লিনার এর string.Equalsবা string.Compareoverloads করে একটি নিতে StringComparisonযুক্তি।
অথবা
if (StringA.Equals(StringB, StringComparison.CurrentCultureIgnoreCase)) {
তবে আপনার নিশ্চিত হওয়া দরকার যে স্ট্রিংএ নাল নয়। তাই সম্ভবত তু ব্যবহার আরও ভাল:
string.Equals(StringA , StringB, StringComparison.CurrentCultureIgnoreCase);
জন পরামর্শ হিসাবে
সম্পাদনা: বাগ সংশোধন করা হয়েছে
তুমি ব্যবহার করতে পার
if (stringA.equals(StringB, StringComparison.CurrentCultureIgnoreCase))
অপারেটর? না, তবে আমি মনে করি আপনি আপনার সংস্কৃতি পরিবর্তন করতে পারেন যাতে স্ট্রিং তুলনাটি কেস-সংবেদনশীল না হয়।
// you'll want to change this...
System.Threading.Thread.CurrentThread.CurrentCulture
// and you'll want to custimize this
System.Globalization.CultureInfo.CompareInfo
আমি বিশ্বাস করি যে এটি সমান অপারেটরের সাথে যেভাবে স্ট্রিংগুলি তুলনা করা হচ্ছে সেভাবে পরিবর্তিত হবে।
বাক্য গঠনটি সহজ করার জন্য এখানে একটি ধারণা:
public class IgnoreCase
{
private readonly string _value;
public IgnoreCase(string s)
{
_value = s;
}
protected bool Equals(IgnoreCase other)
{
return this == other;
}
public override bool Equals(object obj)
{
return obj != null &&
(ReferenceEquals(this, obj) || (obj.GetType() == GetType() && this == (IgnoreCase) obj));
}
public override int GetHashCode()
{
return _value?.GetHashCode() ?? 0;
}
public static bool operator ==(IgnoreCase a, IgnoreCase b)
{
return string.Equals(a, b, StringComparison.OrdinalIgnoreCase);
}
public static bool operator !=(IgnoreCase a, IgnoreCase b)
{
return !(a == b);
}
public static implicit operator string(IgnoreCase s)
{
return s._value;
}
public static implicit operator IgnoreCase(string s)
{
return new IgnoreCase(s);
}
}
ব্যবহারযোগ্য:
Console.WriteLine((IgnoreCase) "a" == "b"); // false
Console.WriteLine((IgnoreCase) "abc" == "abC"); // true
Console.WriteLine((IgnoreCase) "Abc" == "aBc"); // true
Console.WriteLine((IgnoreCase) "ABC" == "ABC"); // true
IgnoreCaseবনাম IgnoreCaseString) এবং অস্পষ্ট (জাভা ইমপ্লিট আনবক্সিং বনাম ইম্পিলিটেড বক্সিং বাছাই করে তাই আমি বিশ্বাস করি যে এটি জাভাতে সেখানে স্ট্রিংয়ে ফিরে আসার সাথে কাজ করবে না)। এবং এটি প্রতিটি নতুন তুলনা করার জন্য কল ট্রি প্রয়োগের সাথে 2 টি নতুন অবজেক্টের মেমরির ওভারহেড তৈরি করে প্রদর্শিত ব্যবহারের ক্ষেত্রে বিভিন্ন নেস্টেড পদ্ধতিতে কল করে। এটি বলেছিল, বেশিরভাগ ক্ষেত্রে পারফরম্যান্স সম্ভবত যথেষ্ট ভাল।
আমি এই তুলনা পদ্ধতি শেষে টাইপ করতে অভ্যস্ত: , StringComparison.
তাই আমি একটি এক্সটেনশন করেছি।
namespace System
{ public static class StringExtension
{
public static bool Equals(this string thisString, string compareString,
StringComparison stringComparison)
{
return string.Equals(thisString, compareString, stringComparison);
}
}
}
কেবলমাত্র নোট করুন যে আপনার thisStringএক্সট্রা কল করার আগে নাল পরীক্ষা করতে হবে ।
if (StringA.ToUpperInvariant() == StringB.ToUpperInvariant()) {
লোকেদের প্রতিবেদন ToUpperInvariant () ToLowerInvariant () এর চেয়ে দ্রুত।
অন্যদের উত্তরগুলি এখানে সম্পূর্ণ বৈধ, তবে কোনওভাবে এটি টাইপ করতে StringComparison.OrdinalIgnoreCaseএবং ব্যবহার করতে কিছুটা সময় নেয় String.Compare।
আমি সরল স্ট্রিং এক্সটেনশন পদ্ধতিটি কোড করে রেখেছি, যেখানে তুলনাটি কেস সংবেদনশীল বা বুলিয়ানয়ের সাথে সংজ্ঞাহীন ক্ষেত্রে উল্লেখ করা যেতে পারে - নিম্নলিখিত উত্তরটি দেখুন: