কোনটি সাধারণত ব্যবহার করা সবচেয়ে ভাল - স্ট্রিংক্যাম্পিয়ারেশন rdআরডিনালআইগনোর কেস বা স্ট্রিংক্যাম্পিয়ারেন্স.আইভিনিয়ার্টক্ল্যাচারআইগনোর কেস?


161

আমার কাছে এর মতো কিছু কোড রয়েছে:

If key.Equals("search", StringComparison.OrdinalIgnoreCase) Then
    DoSomething()
End If

আমি মামলা সম্পর্কে কোন চিন্তা করি না। আমি ব্যবহার করা উচিত OrdinalIgnoreCase, InvariantCultureIgnoreCaseঅথবা CurrentCultureIgnoreCase?


2
এটি এই থ্রেডের জন্য এটি সত্যই দরকারী Check আমার তুলনা করার জন্য অর্ডিয়ানলিগনোরকেস ব্যবহার করার পরামর্শ। ব্লগস.এমএসডিএন
বি /


সামগ্রিকভাবে, আপনি কোন ধরণের জিনিসটির সাথে তুলনা করছেন তা অনেকটা নির্ভর করে। বিশেষত, যদি এটি সংস্কৃতি নির্ভর ব্যবহারকারী ইনপুট বা অভ্যন্তরীণ স্টাফ হয়। আপনি পিসির সংস্কৃতিটি অভ্যন্তরীণ কোডের স্ট্রিংয়ের সাথে তুলনা করতে চান না।
নায়ারগডস

উত্তর:


179

আরও নতুন। নেট ডক্সে এখন আপনার নিজের অবস্থার মধ্যে কোনটি ব্যবহার করা ভাল তা সিদ্ধান্ত নিতে সহায়তা করার জন্য একটি টেবিল রয়েছে।

এমএসডিএন এর " মাইক্রোসফ্ট স্ট্রিং ব্যবহারের জন্য নতুন প্রস্তাবনা। নেট 2.0 " থেকে

সংক্ষিপ্তসার: InvariantCultureস্ট্রিং তুলনা, কেসিং এবং বাছাইয়ের জন্য কোডের মালিকরা আগে Stringমাইক্রোসফ্ট .NET 2.0 তে নতুন ওভারলোডের সেটটি ব্যবহার করার জন্য দৃ strongly়তার সাথে বিবেচনা করা উচিত । বিশেষত, সংস্কৃতি-অজ্ঞানী এবং ভাষাতাত্ত্বিকভাবে অপ্রাসঙ্গিক হিসাবে ডিজাইন করা ডেটা নতুন গণনার সদস্য StringComparison.Ordinalবা StringComparison.OrdinalIgnoreCaseসদস্যদের ব্যবহার করে ওভারলোডগুলি নির্দিষ্ট করা শুরু করা উচিত StringComparison। এগুলি এর সাথে অনুরূপ বাইট-বাই-বাইট তুলনা প্রয়োগ করে strcmpএটি কেবলমাত্র মূলত প্রতীকী স্ট্রিংগুলির ভাষাগত ব্যাখ্যা থেকে বাগগুলি এড়ানো যায় না, তবে আরও ভাল পারফরম্যান্স সরবরাহ করে।


126
তারা পৃথক যেখানে একটি উদাহরণ দিতে, দুটি স্ট্রিং বিবেচনা করুন "Straße"এবং "STRASSE"। রিটার্নগুলি ব্যবহার OrdinalIgnoreCaseকরার সময় , যেখানে তারা সমান বলে। EqualsfalseInvariantCultureIgnoreCase
জেপ্পে স্টিগ নীলসেন


63

এটা সব নির্ভর করে

ইউনিকোড স্ট্রিংগুলির তুলনা করা শক্ত:

টেক্সট প্রসেসিং সফ্টওয়্যারটিতে ইউনিকোড স্ট্রিং অনুসন্ধানগুলি এবং তুলনাগুলি বাস্তবায়নের জন্য সমতুল্য কোড পয়েন্টগুলির উপস্থিতি বিবেচনা করা উচিত। এই বৈশিষ্ট্যের অনুপস্থিতিতে, কোনও নির্দিষ্ট কোড পয়েন্ট ক্রমের সন্ধানকারী ব্যবহারকারীরা অন্য দৃশ্যমান পৃথক পৃথক গ্লিফগুলি খুঁজে পেতে অক্ষম হবেন যা আলাদা, তবে তাত্পর্যপূর্ণ সমতুল্য, কোড পয়েন্ট প্রতিনিধিত্ব করে।

দেখুন: http://en.wikedia.org/wiki/Unicode_equivalence


আপনি একটি মামলা অবশ ভাবে 2 ইউনিকোড স্ট্রিং তুলনা করার চেষ্টা এবং এটি কাজ করতে চান হয় সর্বত্র , আপনি একটি অসম্ভব সমস্যা আছে।

ক্লাসিক উদাহরণটি হ'ল তুর্কি আমি , যা বড় হলে İ হয় (বিন্দুটি লক্ষ্য করুন)

ডিফল্টরূপে। নেট ফ্রেমওয়ার্ক সাধারণত স্ট্রিং সম্পর্কিত ফাংশনগুলির জন্য কারেন্ট কালচার ব্যবহার করে , এর একটি খুব গুরুত্বপূর্ণ ব্যতিক্রম .Equalsএকটি অর্ডিনাল (বাইট বাই বাইট) তুলনা ব্যবহার করে।

এটি কম্পিউটারের সংস্কৃতির উপর নির্ভর করে বিভিন্ন স্ট্রিং ফাংশনগুলিতে নকশার দ্বারা নেতৃত্ব দেয়।


তবুও, কখনও কখনও আমরা একটি "সাধারণ উদ্দেশ্য", কেস সংবেদনশীল, তুলনা চাই।

উদাহরণস্বরূপ, আপনি আপনার স্ট্রিং তুলনাটি একইরকম আচরণ করতে চাইতে পারেন, আপনার অ্যাপ্লিকেশনটি যে কম্পিউটারে ইনস্টল করা আছে তা বিবেচনা করেই।

এটি অর্জন করতে আমাদের কাছে 3 টি বিকল্প রয়েছে:

  1. সংস্কৃতিটি সুস্পষ্টভাবে সেট করুন এবং ইউনিকোড সমতুল্য বিধিগুলি ব্যবহার করে কোনও ক্ষেত্রে সংবেদনশীল তুলনা করুন।
  2. সংস্কৃতিটিকে ইনভেরিয়েন্ট সংস্কৃতিতে সেট করুন এবং ইউনিকোড সমতুল্য বিধিগুলি ব্যবহার করে সংবেদনশীল তুলনায় কেসটি সম্পাদন করুন।
  3. অর্ডিনালআইগনোরকেস ব্যবহার করুন যা ইনভেআরেন্ট কালচার ব্যবহার করে স্ট্রিংকে বড় আকারের করবে এবং তারপরে বাইট তুলনা করে একটি বাইট সম্পাদন করবে।

ইউনিকোড সমতুল্য নিয়মগুলি জটিল, যার অর্থ পদ্ধতি 1) বা 2) এর চেয়ে বেশি ব্যয়বহুল OrdinalIgnoreCase। যে OrdinalIgnoreCaseকোনও বিশেষ ইউনিকোড সাধারনকরণ সম্পাদন করে না, এর অর্থ হ'ল কম্পিউটারের স্ক্রিনে একইভাবে রেন্ডার করা কিছু স্ট্রিংগুলি অভিন্ন হিসাবে বিবেচিত হবে না । উদাহরণস্বরূপ: "\u0061\u030a"এবং "\u00e5"উভয় রেন্ডার å তবে একটি সাধারণ তুলনায় ভিন্ন বিবেচনা করা হবে।

আপনি যেটি বেছে বেছে বেছে বেছে প্রয়োগ করছেন তার উপর নির্ভর করে।

  • আমি যদি একটি লাইন অফ বিজনেস অ্যাপ লিখতাম যা কেবল তুর্কি ব্যবহারকারীরা ব্যবহার করতেন তবে আমি নিশ্চিতভাবে পদ্ধতি 1 ব্যবহার করবো।
  • যদি আমি কেবল একটি সাধারণ "নকল" কেস সংবেদনশীল তুলনা প্রয়োজন, একটি ডিবিতে একটি কলামের নাম বলতে যা সাধারণত ইংরেজি হয় আমি সম্ভবত পদ্ধতি 3 ব্যবহার করতাম।

মাইক্রোসফ্টের স্পষ্ট নির্দেশিকা সহ তাদের সুপারিশগুলির সেট রয়েছে । তবে, এই সমস্যাগুলির কাছে যাওয়ার আগে ইউনিকোড সমতুল্যতার ধারণাটি বোঝা সত্যিই গুরুত্বপূর্ণ important

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


4

আমার ধারণা এটি আপনার পরিস্থিতির উপর নির্ভর করে। যেহেতু অর্ডিনাল তুলনাগুলি অক্ষরগুলির সংখ্যাসূচক ইউনিকোড মানগুলি দেখছে তাই আপনি বর্ণমালা অনুসারে বাছাই করার সময় এগুলি সেরা পছন্দ হবে না won't স্ট্রিং তুলনাগুলির জন্য, যদিও, অর্ডিনালটি দ্রুত এক শিশুর হবে।


1

এটি আপনি কী চান তার উপর নির্ভর করে, যদিও আমি আক্রমণাত্মক সংস্কৃতি থেকে দূরে থাকি আপনি যদি নিশ্চিত হন না যে আপনি অন্য ভাষার জন্য কোডটি স্থানীয়করণ করতে চাইবেন না। পরিবর্তে কারেন্টকালচার ব্যবহার করুন।

এছাড়াও, অর্ডিনালআইগনোরেস সংখ্যার সম্মান করা উচিত, যা আপনি চান তা হতে পারে বা নাও পারে।


1
কখনও মিশ্র ভাষার পরিবেশে ভিবি 6 কোড লিখেছেন? আপনি এমন কোড তৈরি করতে পারেন যা ফরাসী লোকাল দিয়ে পিসিতে সংকলন করে তবে ইংরেজী লোকেলের সাথে পিসিগুলিতে সংকলন করে না, কারণ ফর্ম সংস্থানগুলিতে সঞ্চিত যে কোনও সংখ্যা বর্তমান লোকেলের ফর্ম্যাটটি ব্যবহার করে। আমি তর্ক করব যে আপনার বিপরীত পদ্ধতিটি গ্রহণ করা দরকার: আপনি যখন বর্তমান সংস্কৃতিটি ব্যবহার করেন তখন খুব সাবধান হন। সংস্কৃতিগুলির মধ্যে যখন এর ডেটা সরে যায় তখন আপনার সিস্টেমটি এখনও কাজ করবে কিনা তা নিয়ে সর্বদা ভাবুন। সময় অঞ্চলগুলির সাথে একই জিনিস।
উইম কয়েনেন

আমি "এটি নির্ভর করে" উত্তরের সাথে একমত নই। যদিও "সম্মান সংখ্যা" বিট অনুসরণ না?
স্যাম জাফরান

-1

খুব সহজ উত্তরটি হ'ল আপনি যদি তুর্কি ব্যবহার না করেন তবে আপনার ইনভারেন্টাল কালচার ব্যবহার করার দরকার নেই।

নিম্নলিখিত লিঙ্কটি দেখুন:

সি # তে টুপার () এবং টুঅপারআইভারেন্ট () এর মধ্যে পার্থক্য কী?


5
এই উত্তরটি সহজ হতে পারে তবে এটিও খুব ভুল। তুর্কি "আমি" কেবল একটি উদাহরণ , আরও অনেকগুলি সম্ভাব্য সমস্যা রয়েছে।
ওহাদ স্নাইডার

আর কোন ক্ষতি? আমি কেবল তুর্কি সমস্যার ক্ষেত্রে জানি।
হ্যালো ওয়ার্ল্ড

হ্যাঁ, তুর্কি ছাড়াও আজারি আছে। তবে এটা।
জিম বাল্টার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.