আমি কীভাবে একটি সংবেদনশীল স্ট্রিং তুলনা করতে পারি?


217

আমি কীভাবে নীচের লাইনটিকে সংবেদনশীল হতে পারি?

drUser["Enrolled"] = 
      (enrolledUsers.FindIndex(x => x.Username == (string)drUser["Username"]) != -1);

আমাকে আজ আগে কিছু পরামর্শ দেওয়া হয়েছিল যা আমি ব্যবহার করার পরামর্শ দিয়েছিলাম:

x.Username.Equals((string)drUser["Username"], StringComparison.OrdinalIgnoreCase)));

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

drUser["Enrolled"] = 
      (enrolledUsers.FindIndex(x => x.Username.Equals((string)drUser["Username"], 
                                 StringComparison.OrdinalIgnoreCase)));

কেউ কি সমস্যা চিহ্নিত করতে পারেন?


1
কোন ডাটা টাইপ হওয়া drUser["Enrolled"]উচিত? এটি বুলিয়ান মান হিসাবে দেখায়, তবে FindIndex()সূচকটি দেয়। যদি সেই ব্যবহারকারীর সূচক 0 হয় তবে এটি 0 ফেরত আসবে যা ভুল হতে পারে। যখন, বাস্তবে সত্য হয়। এক্ষেত্রে Exists()পদ্ধতিটি আরও ভাল হতে পারে।
drharris

আপনি কি নিশ্চিত যে ফর্ম্যাট করার কিছু সময় নেই বা একটি ক্ষেত্রের অতিরিক্ত স্থান নেই যা অন্যটিতে নেই?
joshlrogers

1
আমি ফাইন্ড ইন্ডেক্স (এবং পরীক্ষা) এর পরিবর্তে তালিকাভুক্ত ব্যবহারকারীদের জন্য যে কোনও () ব্যবহার করার পরামর্শ দিচ্ছি।
মার্ক

উত্তর:


405

সাম্যতা যাচাই করার জন্য .NET ফ্রেমওয়ার্ক (4 & +) এ সর্বোত্তম অনুশীলন নয়

String.Compare(x.Username, (string)drUser["Username"], 
                  StringComparison.OrdinalIgnoreCase) == 0

পরিবর্তে নিম্নলিখিত ব্যবহার করুন

String.Equals(x.Username, (string)drUser["Username"], 
                   StringComparison.OrdinalIgnoreCase) 

এমএসডিএন সুপারিশ করে:

  • দুটি স্ট্রিং সমান কিনা তা পরীক্ষা করতে স্ট্রিং.একুয়ালস পদ্ধতির একটি ওভারলোড ব্যবহার করুন।
  • স্ট্রিং.কম্পিয়ার এবং স্ট্রিং.কম্পেরটো পদ্ধতি ব্যবহার করুন স্ট্রিংগুলি বাছাই করতে, সমতা পরীক্ষা করার জন্য নয়

8
আপনার ব্যবহার করা উচিত string.Compare, না String.Compare
ফ্রেড

5
@ ফ্রেড আমি সম্মত তবে আপনি কারণটির যোগ্যতা অর্জন করতে পারেন?
গুড্ডর

22
@ ফ্রেড আমি 'কারণ স্টাইলিকপ তাই বলেছে' তার চেয়ে প্রযুক্তিগত কারণে আশাবাদী ছিলাম। আমি কিছু অনুপস্থিত করছি?
গুড্ডর

12
স্ট্রিং.কম্পিয়ার, স্ট্রিং প্রতিশব্দ সিস্টেম. স্ট্রিং ক্লাসের সাথে স্ট্রিং.কমের পার্থক্য নেই। এবং সদস্যের তুলনা একটি এক্সটেনশন পদ্ধতি @ @ ফ্রেড @ গুড্ডর
নুরি

23
@ গুড্ডর একটি ভাষা কীওয়ার্ড হওয়ার stringচেয়ে ভাল অনুশীলন String। এক জন্য, Stringঅন্য কিছু হতে পারে System.String, যেখানে stringহতে পারে না। এছাড়াও, stringসি # তে কম-বেশি থাকার গ্যারান্টিযুক্ত, যেখানে Stringপ্রযুক্তিগতভাবে সি # এর পরিবর্তে .NET এর অংশ।
ডেভ কাজিনো

36

আপনার String.Compareনীচের মত স্থির ফাংশন ব্যবহার করা উচিত

x => String.Compare (x.Username, (string)drUser["Username"],
                     StringComparison.OrdinalIgnoreCase) == 0

6
না, আপনার String.Equalsপরিবর্তে ব্যবহার করা উচিত String.Compare। কোনটি বৃহত্তর তা গণনা করার দরকার নেই, কেবল তারা সমান নয়।
এরিক

@ এরিক: আমি অবাক, আপনি আরও 6 বছরের মধ্যে কোন পদ্ধতিটি ব্যবহার করার পরামর্শ দিবেন :-)
ওলেগ

3
আমি অবাক হই না! আমি বিশ্বাস করি যে আপনি যখন সাম্য শব্দার্থকতা চান তখন আমি সাম্যতা ব্যবহার করার পরামর্শ দিই এবং যখন আপনি তুলনামূলক শব্দার্থবিদ্যা চান তখন তুলনা ব্যবহার করার পরামর্শ দিই। এ সম্পর্কে কি এত কঠিন? IEquatableএবং IComparableএকই জিনিসটি করবেন না এবং আপনার এমন একটি ক্লাস থাকতে পারে যা একটি প্রয়োগ করে তবে এতে অন্যটি প্রয়োগ করার কোনও অর্থ নেই। উদাহরণস্বরূপ, আপনি সেন্সর স্যাম্পলিংগুলির সাথে কোনওটির সমান না হয়ে (আইকো এমপারেবল) অর্ডার করতে পারেন। এবং, আপনি জিনিসগুলি সমান (আইকুয়েটেবল) কিনা তা নির্দেশ করতে পারেন তবে তাদের অর্ডার দেওয়ার কোনও মানে হয় না (বলুন, কম্পিউটার সিরিয়াল নম্বর)।
এরিক

@ এরিক: আপনি আমার দৃষ্টিভঙ্গি বুঝতে পারছেন না। পুরানো উত্তর লেখার সময়কে সামঞ্জস্য করে। পুরানো উত্তরগুলির স্পর্শ করা উচিত নয়। এটি বেশিরভাগ পণ্য সম্পর্কে সত্য। পারফরম্যান্স দৃষ্টিকোণ থেকে সেরা অনুশীলন বা সেরা পছন্দ পরে একাধিকবার পরিবর্তন করা যেতে পারে। আমি কোন পুরানো উত্তর সম্পর্কে আলোচনা করার কোন বুদ্ধি দেখতে পাচ্ছি।
ওলেগ

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

27

তুলনা করার জন্য এটি ব্যবহার করুন:

string.Equals(a, b, StringComparison.CurrentCultureIgnoreCase);

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

7

অন্যদের উত্তরগুলি এখানে সম্পূর্ণ বৈধ, তবে কোনওভাবে এটি টাইপ করতে StringComparison.OrdinalIgnoreCaseএবং ব্যবহার করতে কিছুটা সময় নেয় String.Compare

আমি সরল স্ট্রিং এক্সটেনশান পদ্ধতিটি কোড করেছি, যেখানে তুলনাটি কেস সংবেদনশীল বা বুলিয়ান সহ বুদ্ধিমানের ক্ষেত্রে, পুরো কোড স্নিপেটটি এখানে সংযুক্ত করে নির্দিষ্ট করতে পারলে:

using System;

/// <summary>
/// String helpers.
/// </summary>
public static class StringExtensions
{
    /// <summary>
    /// Compares two strings, set ignoreCase to true to ignore case comparison ('A' == 'a')
    /// </summary>
    public static bool CompareTo(this string strA, string strB, bool ignoreCase)
    {
        return String.Compare(strA, strB, ignoreCase) == 0;
    }
}

এর পরে সম্পূর্ণ তুলনাটি প্রায় 10 টি অক্ষর দ্বারা সংক্ষিপ্ত হয়ে যায় - তুলনা করুন:

স্ট্রিং এক্সটেনশন ব্যবহার করার আগে:

String.Compare(testFilename, testToStart,true) != 0

স্ট্রিং এক্সটেনশন ব্যবহার করার পরে:

testFilename.CompareTo(testToStart, true)

2
আমি নামকরণের সাথে একমত নই, তুলনা করা সফ্টওয়্যার দেবের একটি সুপরিচিত ফাংশন এবং আপনি যা করেন তা আপনি মৌলিকভাবে পরিবর্তন করেছেন। আমি মনে করি আপনার হয় হয় তুলনা মত একটি পূর্বাবস্থায় ফিরে আসা বা নাম অন্য কিছু, 'ইস্কুয়াল' হিসাবে পরিবর্তন করা উচিত।
ফ্রেড

7

আপনি System.Stringকেস সংবেদনশীল তুলনা এক্সটেনশন পদ্ধতি সরবরাহ করতে (বিপরীত হলেও) প্রসারিত করতে পারেন :

public static bool CIEquals(this String a, String b) {
    return a.Equals(b, StringComparison.CurrentCultureIgnoreCase);
}

এবং যেমন ব্যবহার করুন:

x.Username.CIEquals((string)drUser["Username"]);

সি # আপনাকে এমন এক্সটেনশন পদ্ধতি তৈরি করতে দেয় যা আপনার প্রকল্পে সিনট্যাক্স সুগার হিসাবে পরিবেশন করতে পারে, আমি বলি বেশ দরকারী।

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


3

আমি মনে করি আপনি এই লিঙ্কে আরও তথ্য পাবেন:

http://codeidol.com/community/dotnet/controlling-case-sensitivity-when-comparing-two-st/8873/

দুটি স্ট্রিংয়ের তুলনা করার জন্য স্ট্রিং ক্লাসে তুলনা স্থিতির পদ্ধতিটি ব্যবহার করুন। তুলনা কেস-সংবেদনশীল কিনা তা এর একটি ওভারলোডের তৃতীয় প্যারামিটার দ্বারা নির্ধারিত হয়। উদাহরণ স্বরূপ:

string lowerCase = "abc";
string upperCase = "AbC";
int caseInsensitiveResult = string.Compare(lowerCase, upperCase,
  StringComparison.CurrentCultureIgnoreCase);
int caseSensitiveResult = string.Compare(lowerCase,
  StringComparison.CurrentCulture);

কেস সেনসিটিভ রিসাল্ট মান -1 (ইঙ্গিত করে যে লোয়ারকেস "আপার কেস এর চেয়ে" কম) এবং কেস ইনসেনসেটিভ রেজাল্ট শূন্য (ইঙ্গিত করে যে লোয়ারকেস "সমান" আপার কেস সমান)।


1

StringComparison.CurrentCultureIgnoreCaseপরিবর্তে ব্যবহার সম্পর্কে ?


5
-1: এই উত্তরটি অপর্যাপ্ত। @ Ocean4dream এর উত্তর দেখার করুন: stackoverflow.com/a/13965429/109941
জিম জি

@ ডেসাইক্লোন: এটি অর্ডিনালআইগনরেসেসের চেয়ে ধীর, তবে কিছু ক্ষেত্রে প্রাসঙ্গিক হতে পারে। অতএব আমি -1 দেব না। stackoverflow.com/questions/2749662/…
সিসাবা তোথ


1

আমি ইক্যুয়ালআইগনোর কেসের জন্য একটি এক্সটেনশন পদ্ধতি লিখতে চাই

public static class StringExtensions
{
    public static bool? EqualsIgnoreCase(this string strA, string strB)
    {
        return strA?.Equals(strB, StringComparison.CurrentCultureIgnoreCase);
    }
}

-11

আপনি সর্বদা ফাংশন ব্যবহার করতে পারেন: .টোলওয়ার (); .ToUpper ();

আপনার স্ট্রিং রূপান্তর করুন এবং তারপরে তাদের তুলনা করুন ...

শুভকামনা


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

7
এটি একটি নতুন স্ট্রিং তৈরি করে, তাই আমি এটিকে খুব অদক্ষ মনে করি। কারণ এই নতুন স্ট্রিংটি তৈরি করতে সমস্ত অক্ষর পরীক্ষা করা হবে এবং পছন্দসই ক্ষেত্রে রূপান্তরিত হবে, তারপরে তুলনাটি সমস্ত অক্ষর আবার পরীক্ষা করতে হবে। সুতরাং এটি আরও মেমরি এবং প্রক্রিয়াকরণ শক্তি ব্যবহার করে।
এয়ার 2

5
স্মৃতি বরাদ্দের কারণে এটি খুব খারাপ অনুশীলন।
থোরবজর্ন লিন্ডেজ্জার

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