স্ট্রিংয়ের পার্থক্যগুলি সি # তে পদ্ধতিগুলির তুলনা করুন


261

সি # তে স্ট্রিংয়ের তুলনা করা বেশ সহজ। আসলে এটি করার বিভিন্ন উপায় রয়েছে। আমি নীচে ব্লকে কিছু তালিকাভুক্ত করেছি। আমি যে সম্পর্কে কৌতূহলী তা হ'ল তাদের মধ্যে পার্থক্যগুলি এবং যখন অন্যকে ব্যবহার করা উচিত? একজনকে কি আদৌ এড়ানো উচিত? আরও কি আমি তালিকাবদ্ধ না?

string testString = "Test";
string anotherString = "Another";

if (testString.CompareTo(anotherString) == 0) {}
if (testString.Equals(anotherString)) {}
if (testString == anotherString) {}

(দ্রষ্টব্য: আমি এই উদাহরণে সাম্যের সন্ধান করছি, এর চেয়ে কম বা তার চেয়ে বেশি নয় তবে এ বিষয়ে মন্তব্য করতে নির্দ্বিধায়)


4
একটি ফাঁদ হ'ল আপনি স্ট্রিংভ্যালু করতে পারবেন না qu উদাহরণস্বরূপ (নাল) যে আপনি ধরে
ফেলছেন নালায়


@ রবার্টহারভে আমি স্ট্যাকওভারফ্লোতে আসার কারণটি হ'ল উত্তরের জন্য আমাকে একাধিক পৃষ্ঠা পড়তে হবে না।
সায়ফুল নিজাম ইয়াহইয়া

@Syaiful: কারনেই আমি স্ট্যাক ওভারফ্লো আসা উত্তরগুলি খুঁজে হয় না ডকুমেন্টেশনে।
রবার্ট হার্ভে

উত্তর:


231

এই ফাংশনগুলি কীভাবে কাজ করে তার জন্য এখানে নিয়ম রয়েছে:

stringValue.CompareTo(otherStringValue)

  1. null একটি স্ট্রিং আগে আসে
  2. এটি ব্যবহার করে CultureInfo.CurrentCulture.CompareInfo.Compare, যার অর্থ এটি সংস্কৃতি নির্ভর তুলনা ব্যবহার করবে। এর অর্থ হতে পারে যে এটি জার্মানিতে ßসমান SSবা তার সাথে তুলনা করবে

stringValue.Equals(otherStringValue)

  1. null কোন কিছুর সমান বিবেচনা করা হয় না
  2. আপনি যদি কোনও StringComparisonবিকল্প নির্দিষ্ট না করেন তবে এটি সরাসরি অমিতিব্য সমতা যাচাইয়ের মতো দেখতে ব্যবহার করবে, অর্থাত্ কোনও ভাষা বা সংস্কৃতিতে ßএকইরকম নয়SS

stringValue == otherStringValue

  1. যেমন হয় না stringValue.Equals()
  2. ==অপারেটর স্ট্যাটিক আহ্বান Equals(string a, string b)পদ্ধতি (যা আবার একটি অভ্যন্তরীণ যায় EqualsHelperতুলনা না।
  3. স্ট্রিংয়ে কল .Equals()করা রেফারেন্স ব্যতিক্রম nullপায় null, যখন অন ==হয় না।

Object.ReferenceEquals(stringValue, otherStringValue)

কেবলমাত্র পরীক্ষা করে দেখুন যে রেফারেন্সগুলি একই, অর্থাৎ এটি একই বিষয়বস্তুগুলির সাথে কেবল দুটি স্ট্রিং নয়, আপনি নিজের সাথে একটি স্ট্রিং অবজেক্টের তুলনা করছেন।


নোট করুন যে পদ্ধতি কলগুলির উপরের বিকল্পগুলির সাথে, কীভাবে তুলনা করতে হবে তা নির্দিষ্ট করার জন্য আরও বিকল্পগুলির সাথে ওভারলোড রয়েছে।

আমার পরামর্শ যদি আপনি কেবল সাম্যতার জন্য যাচাই করতে চান তবে হ'ল আপনি সংস্কৃতি নির্ভর তুলনাটি ব্যবহার করতে চান কিনা এবং আপনার পছন্দের উপর নির্ভর করে .CompareToবা ব্যবহার করতে চান কিনা তা আপনার মন তৈরি করা .Equals


5
"স্ট্রিংভ্যালু.একুয়ালস (অন্যান্য স্ট্রিংভ্যালু): নাল নাল সমান নয়" লোল, আমি বলব না। নাল সমান অবজেক্ট রেফারেন্সনোটসেট ব্যতিক্রম।
কেভিন

29
== সমান () হিসাবে সমান নয় ... ... == অপারেটর স্থিতিশীল সমানকে (স্ট্রিং এ, স্ট্রিং বি) পদ্ধতিটিকে কল করে (যা পরিবর্তিতভাবে অভ্যন্তরীণ ইক্যুয়ালসেলপারে তুলনা করতে যায় Call কলিং qu এক নলের উপর সমান স্ট্রিং যখন == উপর না নাল রেফারেন্স exc
ড্যান সি

2
অন্যদিকে, .কোয়ালগুলি সামান্য দ্রুত (অভ্যন্তরীণভাবে একটি কম পদ্ধতি কল), তবে কম পঠনযোগ্য - অবশ্যই তর্কযোগ্য :)।
ড্যান সি

আমি ভাবছিলাম '==' রেফারেন্সের তুলনা এবং অবজেক্ট করবে will
অমেশ

@ লাসেভি.কার্লসেন আপনার মতামত সম্পর্কে String.Compareকী?
জেডিএন্ডসিপস

72

এমএসডিএন থেকে:

"তুলনামূলক পদ্ধতিটি মূলত বাছাই বা বর্ণমালার ক্রিয়াকলাপগুলিতে ব্যবহারের জন্য ডিজাইন করা হয়েছিল the দুটি কড়ি সমান কিনা তা নির্ধারণ করার জন্য যখন পদ্ধতি কলের প্রাথমিক উদ্দেশ্য হয় তখন এটি ব্যবহার করা উচিত নয় two দুটি স্ট্রিং সমান কিনা তা নির্ধারণ করার জন্য, সমান পদ্ধতিটি কল করুন। "

সম্পূর্ণরূপে সাম্যের দিকে তাকানোর .Equalsপরিবর্তে তারা ব্যবহারের পরামর্শ দেয় .CompareTo। আমি যদি সেখানে মধ্যে একটি পার্থক্য আছে নিশ্চিত নই .Equalsএবং ==জন্য stringবর্গ। আমি পরে মাঝে মাঝে আমার নিজের ক্লাসের জন্য .Equalsবা Object.ReferenceEqualsতার পরিবর্তে ==ব্যবহার করব যদি কেউ পরবর্তী সময়ে আসে এবং ==সেই শ্রেণীর জন্য অপারেটরের নতুন সংজ্ঞা দেয় ।


18
তা কি কখনও আপনার সাথে ঘটেছিল? (Redefining ==) ... আমি এটা waaaay খুব আত্মরক্ষামূলক প্রোগ্রামিং হিসেবে দেখতে =)
জুয়ান

হ্যাঁ, সে কারণেই আমি এখন অবজেক্টটি ব্যবহার করি e এটি একটি বাচ্চার অত্যধিক প্রতিরক্ষামূলক হতে পারে, তবে আমি এটি সম্পর্কে উন্মত্ত নই এবং সত্য সত্যই এই পরিস্থিতিটি প্রায়শই পপ আপ হয় না।
এড এস

আমি সন্দেহ করি যে এই 'ডিফেন্সিভ কোডিং' দরকারী। যদি শ্রেণীর মালিককে == অপারেটরকে ওভাররাইড করার প্রয়োজন হয়, তবে কেউ এটি ব্যবহার করছে না তা খুঁজে বের করে?
ডেভ ভ্যান ডেন এয়েণ্ডে

1
@ ডেভভ্যান্ডেন এয়েন্ডে: হ্যাঁ ... আমি কিছুক্ষণ আগে এটি লিখেছিলাম। আমি এটি নিয়মিত করি না, কেবল ওভাররাইডিং appropriate যথাযথ হলে উপযুক্ত।
এড এস

1
মাইক্রোসফ্টের সুপারিশটি এখানে রেকর্ড করা হয়েছে:। নেট ফ্রেমওয়ার্কে স্ট্রিং ব্যবহারের জন্য সেরা অভ্যাস
জেজেএস

50

আপনি যদি ছাত্রলীগের পদ্ধতিগুলির মধ্যে পার্থক্য সম্পর্কে সদা আগ্রহী হন, প্রতিচ্ছবি আপনার বন্ধু :-)

আমি এই নির্দেশাবলী অনুসরণ:

যথাযথ মিল: সম্পাদনা: আমি আগে সর্বদা == অপারেটরটি নীতির ভিত্তিতে ব্যবহার করতাম যে সমান (স্ট্রিং, স্ট্রিং) এর মধ্যে অবজেক্ট == অপারেটরটি বস্তুর রেফারেন্সের তুলনা করতে ব্যবহৃত হয় তবে এটি strA.Equals (strB) এখনও 1-1% হয় স্ট্রিংয়ের তুলনায় সামগ্রিকভাবে দ্রুত E আমি একই / বিভিন্ন স্ট্রিং দৈর্ঘ্য এবং বিভিন্ন আকারের (1B থেকে 5MB) উভয় ইন্টার্নড / নন-ইন্টার্নড স্ট্রিং মানগুলিতে স্টপওয়াচের সাথে পরীক্ষিত লুপটি করেছি।

strA.Equals(strB)

মানব-পঠনযোগ্য মিল (পশ্চিমা সংস্কৃতি, কেস-সংবেদনশীল):

string.Compare(strA, strB, StringComparison.OrdinalIgnoreCase) == 0

মানব-পঠনযোগ্য মিল (অন্যান্য সমস্ত সংস্কৃতি, সংবেদনশীল কেস / অ্যাকসেন্ট / কানা / ইত্যাদি সংস্কৃতিআইএনফো দ্বারা সংজ্ঞায়িত):

string.Compare(strA, strB, myCultureInfo) == 0

কাস্টম বিধিগুলির সাথে মানব-পঠনযোগ্য মিল (অন্যান্য সমস্ত সংস্কৃতি):

CompareOptions compareOptions = CompareOptions.IgnoreCase
                              | CompareOptions.IgnoreWidth
                              | CompareOptions.IgnoreNonSpace;
string.Compare(strA, strB, CultureInfo.CurrentCulture, compareOptions) == 0

18

যেমনটি এড বলেছিলেন, তুলনা করার জন্য তুলনামূলক ব্যবহার করা হয়।

.Aals এবং == এর মধ্যে পার্থক্য রয়েছে।

== নিম্নলিখিত কোডটি মূলত সমাধান করে :

if(object.ReferenceEquals(left, null) && 
   object.ReferenceEquals(right, null))
    return true;
if(object.ReferenceEquals(left, null))
    return right.Equals(left);
return left.Equals(right);

এর সহজ কারণটি হ'ল নিম্নলিখিতটি ব্যতিক্রম করবে:

string a = null;
string b = "foo";

bool equal = a.Equals(b);

এবং নিম্নলিখিতগুলি করবে না:

string a = null;
string b = "foo";

bool equal = a == b;

15

গুড ব্যাখ্যা এবং স্ট্রিং তুলনা বিষয় সম্পর্কে চর্চা প্রবন্ধে পাওয়া যেতে পারে মাইক্রোসফট .NET 2.0 মধ্যে Strings ব্যবহার জন্য নতুন প্রস্তাব এবং এ .NET ফ্রেমওয়ার্ক মধ্যে Strings ব্যবহারের সেরা


উল্লিখিত প্রতিটি পদ্ধতির (এবং অন্যান্য) নির্দিষ্ট উদ্দেশ্য রয়েছে। তাদের মধ্যে মূল পার্থক্য হ'ল তারা ডিফল্টরূপে স্ট্রিংকোম্পারেন্স এনুমেরেশনটি কীভাবে ব্যবহার করছে। বিভিন্ন বিকল্প রয়েছে:

  • CurrentCulture
  • CurrentCultureIgnoreCase
  • InvariantCulture
  • InvariantCultureIgnoreCase
  • পূরণবাচক
  • OrdinalIgnoreCase

উপরের তুলনা প্রকারের প্রতিটি পৃথক ব্যবহারের ক্ষেত্রে লক্ষ্য করে:

  • পূরণবাচক
    • কেস-সংবেদনশীল অভ্যন্তরীণ শনাক্তকারী
    • এক্সএমএল এবং এইচটিটিপি এর মতো মানের ক্ষেত্রে সংবেদনশীল শনাক্তকারী
    • কেস-সংবেদনশীল সুরক্ষা সম্পর্কিত সেটিংস
  • OrdinalIgnoreCase
    • কেস-সংবেদনশীল অভ্যন্তরীণ শনাক্তকারী
    • এক্সএমএল এবং এইচটিটিপি এর মতো মানের ক্ষেত্রে সংবেদনশীল শনাক্তকারী
    • ফাইল পাথ (মাইক্রোসফ্ট উইন্ডোজে)
    • রেজিস্ট্রি কী / মান
    • পরিবেশের পরিবর্তনশীল
    • সংস্থান শনাক্তকরণ (উদাহরণ হিসাবে হ্যান্ডেল নাম)
    • কেস সংবেদনশীল সুরক্ষা সম্পর্কিত সেটিংস
  • ইনভায়রিন্টকালচার বা ইনভায়রেন্ট কালচারআইগনোর কেস
    • কিছু ভাষাগত-প্রাসঙ্গিক ডেটা অব্যাহত রাখে
    • একটি নির্দিষ্ট বাছাই ক্রমের জন্য প্রয়োজনীয় ভাষাগত ডেটার প্রদর্শন
  • কারেন্টকালচার বা কারেন্টকালচারআইগনরেস কেস
    • ব্যবহারকারীর কাছে প্রদর্শিত ডেটা
    • সর্বাধিক ব্যবহারকারীর ইনপুট

দ্রষ্টব্য, স্ট্রিং তুলনা পদ্ধতিগুলির জন্য স্ট্রিংকোম্পেরেন্স এলুমারেশনের পাশাপাশি ওভারলোডগুলি .NET 2.0 থেকে বিদ্যমান।


স্ট্রিং.কম্পিয়ারটো পদ্ধতি (স্ট্রিং)

আসলে আইকোম্যাপারেবল নিরাপদ বাস্তবায়ন.কম্পেরটো পদ্ধতিটি । ডিফল্ট ব্যাখ্যা: কারেন্টকালচার।

ব্যবহার:

কম্পেরিটো পদ্ধতিটি প্রাথমিকভাবে বাছাই বা বর্ণমালা সংক্রান্ত ক্রিয়াকলাপগুলিতে ব্যবহারের জন্য ডিজাইন করা হয়েছিল

এইভাবে

আইকোম্যাপেবল ইন্টারফেস প্রয়োগ করা অগত্যা এই পদ্ধতিটি ব্যবহার করবে

স্ট্রিং.কোপার মেথড

স্ট্রিং ক্লাসের স্থিতিশীল সদস্য যার অনেকগুলি ওভারলোড রয়েছে। ডিফল্ট ব্যাখ্যা: কারেন্টকালচার।

যখনই সম্ভব, আপনার তুলনা পদ্ধতির একটি ওভারলোড কল করা উচিত যাতে একটি স্ট্রিংকোম্পিয়ারি প্যারামিটার অন্তর্ভুক্ত।

স্ট্রিং.একুয়ালস পদ্ধতি

বিষয়বস্তু শ্রেণি থেকে ওভারডিডেন এবং প্রকার সুরক্ষার জন্য ওভারলোডড। ডিফল্ট ব্যাখ্যা: অর্ডিনাল। লক্ষ্য করুন:

স্ট্রিং ক্লাসের সাম্যতা পদ্ধতির মধ্যে স্ট্যাটিক ইক্যুয়াল , স্ট্যাটিক অপারেটর == এবং উদাহরণ পদ্ধতি সমান রয়েছে


স্ট্রিংকম্পার ক্লাস

স্ট্রিং তুলনা মোকাবিলার আরও একটি উপায়ও রয়েছে বিশেষত: বাছাইকরণের লক্ষ্য:

জেনেরিক সংগ্রহে উপাদানগুলিকে সাজানোর জন্য টাইপ-নির্দিষ্ট তুলনা তৈরি করতে আপনি স্ট্রিংকম্পার ক্লাসটি ব্যবহার করতে পারেন । হ্যাশটেবল, ডিকশনারি, সোর্টডলিস্ট এবং সোর্টার্ডলিস্টের মতো ক্লাসগুলি বাছাইয়ের উদ্দেশ্যে স্ট্রিংকম্পার ক্লাস ব্যবহার করে।


2
এসও-তে অন্য কয়েকটি পোস্ট অনুসারে, অর্ডিনাল ব্যতীত অন্যান্য সমস্ত পদ্ধতির ক্ষেত্রে তুলনা (ক, খ) এবং তুলনা (খ, ক) উভয়ই ১ টি ফিরে আসতে পারে এবং বাগটি ঠিক করা হবে না বলে শ্রেণিবদ্ধ করা হয়েছে "। যেমনটি, আমি নিশ্চিত না যে এই জাতীয় তুলনার কোনও ব্যবহারের ক্ষেত্রে রয়েছে।
সুপারক্যাট

@ সুপের্যাট আপনি কি এর সাথে লিঙ্ক করতে পারেন, বা উদাহরণ দিতে পারেন?
নোটটিস


7

যে পারফরম্যান্সটি সাধারণত আপনার এটি করা প্রয়োজন তার 99% বারের সাথে গুরুত্বপূর্ণ নয়, তবে আপনি যদি কয়েক মিলিয়ন বার লুপে এটি করতে চান তবে আমি আপনাকে সুপারিশ করব যে আপনি ব্যবহার করুন qu সমীকরণ বা == কারণ এটি কোনও চরিত্র খুঁজে পাওয়ার সাথে সাথেই use এটি মেলে না এটি পুরো জিনিসটিকে মিথ্যা হিসাবে ছুঁড়ে ফেলেছে, তবে আপনি যদি তুলনামূলকভাবে ব্যবহার করেন তবে এটি নির্ধারণ করতে হবে কোন চরিত্রটি অন্যটির চেয়ে কম, এটি পারফরম্যান্সের সময়কে আরও খারাপের দিকে নিয়ে যায়।

যদি আপনার অ্যাপ্লিকেশনটি বিভিন্ন দেশে চলমান থাকে, আমি আপনাকে পরামর্শ দিচ্ছি যে আপনি কালচারআইনফো সম্পর্কিত প্রভাবগুলি একবার দেখুন এবং সম্ভবত ব্যবহার করুন qu যেহেতু আমি কেবলমাত্র মার্কিন যুক্তরাষ্ট্রে অ্যাপ্লিকেশন লিখি (এবং এটি কারও দ্বারা সঠিকভাবে কাজ না করে তা যত্ন করে না), তাই আমি সর্বদা কেবল == ব্যবহার করি।


5

আপনি এখানে তালিকাভুক্ত ফর্মগুলিতে, দুটির মধ্যে খুব বেশি পার্থক্য নেই। বর্তমান সংস্কৃতি ব্যবহার করে তুলনা করে এমন CompareToএকটি CompareInfoপদ্ধতি কল করার সমাপ্তি ঘটে; অপারেটর Equalsদ্বারা ডাকা হয় ==

আপনি যদি ওভারলোডগুলি বিবেচনা করেন তবে জিনিসগুলি আলাদা হয়। Compareএবং ==কেবল স্ট্রিংয়ের তুলনা করতে বর্তমান সংস্কৃতিটি ব্যবহার করতে পারে। Equalsএবং String.Compareএকটি StringComparisonগণনা যুক্তি নিতে পারে যা আপনাকে সংস্কৃতি-সংবেদনশীল বা কেস-সংবেদনশীল তুলনা নির্দিষ্ট করতে দেয়। শুধুমাত্র String.Compareআপনাকে CultureInfoডিফল্ট সংস্কৃতি ছাড়া অন্য সংস্কৃতি ব্যবহার করে একটি নির্দিষ্ট করতে এবং তুলনা সম্পাদনের অনুমতি দেয় ।

এর বহুমুখিতাটির কারণে, আমি দেখতে পাই String.Compareযে অন্য তুলনামূলক পদ্ধতির চেয়ে আমি বেশি ব্যবহার করি ; এটি আমাকে যা চাই ঠিক তা নির্দিষ্ট করতে দেয়।


2

একটি বিগ পার্থক্য মনে রাখবেন। প্রথম স্ট্রিংটি শূন্য হলে কোয়ালিটি () একটি ব্যতিক্রম ছুঁড়ে ফেলবে, যেখানে == না হয়।

       string s = null;
        string a = "a";
        //Throws {"Object reference not set to an instance of an object."}
        if (s.Equals(a))
            Console.WriteLine("s is equal to a");
        //no Exception
        if(s==a)
            Console.WriteLine("s is equal to a");

0
  • s1.CompareTo (s2): প্রাথমিক উদ্দেশ্যটি দুটি স্ট্রিং সমান কিনা তা নির্ধারণ করার জন্য ব্যবহার করবেন না
  • s1 == s2: কেস উপেক্ষা করতে পারবেন না
  • s1.Equals (s2, স্ট্রিংক্যাম্পেরেশন): নালরেফারেন্সএক্সেপশন নিক্ষেপ করে যদি s1 নাল হয়
  • String.Equals (S2, StringComparison): eliminiation প্রক্রিয়া, এই স্ট্যাটিক পদ্ধতি বিজয়ী (একটি টিপিক্যাল ব্যবহারের ক্ষেত্রে অভিমানী কিনা তা নির্ধারণ করতে দুটি স্ট্রিং হয় সমতুল্য)!


-9

.কোয়ালের সাথে, আপনি স্ট্রিংকোপার্শন বিকল্পগুলিও অর্জন করতে পারেন। কেস এবং অন্যান্য বিষয় উপেক্ষা করার জন্য খুব সুবিধাজনক।

বিটিডব্লিউ, এটি মিথ্যা হিসাবে মূল্যায়ন করবে

string a = "myString";
string b = "myString";

return a==b

যেহেতু == a এবং b এর মানগুলির তুলনা করে (যা পয়েন্টার) এটি কেবল তখনই মূল্যায়ন করবে যদি পয়েন্টারগুলি মেমরিতে একই বস্তুর দিকে নির্দেশ করে। .কোয়ালগুলি পয়েন্টারগুলিকে অবলম্বন করে এবং পয়েন্টারে সঞ্চিত মানের তুলনা করে। a.Equals (খ) এখানে সত্য হবে।

এবং আপনি যদি খ পরিবর্তন করেন:

b = "MYSTRING";

তাহলে a.Equals (খ) মিথ্যা, কিন্তু

a.Equals(b, StringComparison.OrdinalIgnoreCase) 

সত্য হবে

a.CompareTo (b) স্ট্রিংয়ের CompareTo ফাংশনকে কল করে যা পয়েন্টারগুলিতে মানগুলির তুলনা করে এবং <0 এ সংরক্ষণ করা মান যদি খ-তে সঞ্চিত মানের চেয়ে কম হয় তবে 0 প্রদান করে a.Equals (খ) সত্য, এবং > 0 অন্যথায়। যাইহোক, এটি কেস সংবেদনশীল, আমি মনে করি তুলনামূলকভাবে কেস এবং এ জাতীয় উপেক্ষা করার পক্ষে বিকল্প রয়েছে তবে এখন দেখার মতো সময় নেই। অন্যরা যেমন ইতিমধ্যে জানিয়েছে, এটি বাছাইয়ের জন্য করা হবে। এই পদ্ধতিতে সাম্যের জন্য তুলনা করার ফলে অতিরিক্ত ওভারহেড আসবে।

আমি নিশ্চিত যে আমি জিনিসগুলি বাইরে রেখে চলেছি, তবে আমার মনে হয় আপনার আরও বিশদ বিবরণ প্রয়োজন হলে পরীক্ষা শুরু করার জন্য এটি পর্যাপ্ত তথ্য হওয়া উচিত।


9
A == খ অংশটি ভুল। == অপারেটর স্ট্রিং ক্লাসের জন্য কার্যকরভাবে ওভারলোড হয় এবং এটি প্রকৃত উল্লেখগুলি নির্বিশেষে মানগুলির সাথে তুলনা করে।
গয়িক্স
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.