সি # তে স্ট্রিং কী-টাইপ সহ কেস-সংবেদনশীল অভিধান


155

আমার যদি একটি Dictionary<String,...>থাকে তবে ContainsKeyকেস-সংবেদনশীলদের মতো পদ্ধতি তৈরি করা সম্ভব ?

এটি সম্পর্কিত বলে মনে হয়েছিল, তবে আমি এটি সঠিকভাবে বুঝতে পারি নি: সি # অভিধান: ঘোষণার মাধ্যমে কী কেস-সংবেদনশীল তৈরি করা


5
ব্যবহারে ভুল কী StringComparer.InvariantCultureIgnoreCase? এটি যা বলেছে তা করে ...
লেপ্পি

5
আমি এর কথা কখনই শুনিনি, তাই প্রশ্ন!
মিঃ বয়


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

উত্তর:


321

এটি সম্পর্কিত বলে মনে হয়েছিল, তবে আমি এটি সঠিকভাবে বুঝতে পারি নি: সি # অভিধান: ঘোষণার মাধ্যমে কী কেস-সংবেদনশীল তৈরি করা

এটা আসলে সম্পর্কিত। সমাধানটি হ'ল ডিকোশনারি উদাহরণটি স্ট্যান্ডার্ড স্ট্রিং তুলনা পদ্ধতিটি (যা কেস সংবেদনশীল) ব্যবহার না করে বরং কেস সংবেদনশীল একটি ব্যবহার করার জন্য বলে। এটি উপযুক্ত নির্মাতা ব্যবহার করে করা হয় :

var dict = new Dictionary<string, YourClass>(
        StringComparer.InvariantCultureIgnoreCase);

কনস্ট্রাক্টর এমন একটি প্রত্যাশা করে IEqualityComparerযা কীভাবে কীগুলি কীভাবে তুলনা করতে হয় তার অভিধানকে বলে।

StringComparer.InvariantCultureIgnoreCaseআপনাকে একটি IEqualityComparerউদাহরণ দেয় যা কেস-সংবেদনশীল পদ্ধতিতে স্ট্রিংগুলির সাথে তুলনা করে।


1
নিখুঁত, আমি কোনওভাবেই এসটিএলের মতো কর্টারে তুলনামূলক পাস করার উপায়টি মিস করেছি।
মিঃ বয়

7
আমি কখনই এখানে কোনও কোডিং প্রশ্নের উত্তর খুঁজে পাই কী করে তা আমাকে বিস্মিত করে না! আমি আপনার পরের বিড়ালের নাম রাখব, কনরাড! :-)
জেমি

10
সম্ভব, StringComparison.OrdinalIgnoreCase comparer যতো তাড়াতাড়ি সংস্কৃতি ভিত্তিক: stackoverflow.com/questions/492799/...
Manushin ইগর

আমি যদি কোনও অভিধান তৈরি না করে একটি বিদ্যমান অভিধানে একটি সংবেদনশীল কী ম্যাচের জন্য কনটেনসকে () ব্যবহার করার চেষ্টা করছি যা আমি কোনও অবজেক্টের অংশ হিসাবে পেয়েছি তবে কীভাবে করব?
শ্রীধর আর কুলকারনী

1
@ শ্রীধরআরকুলকার্নি আপনি মৌলিকভাবে (দক্ষতার সাথে) পারবেন না। তুলনা যুক্তিটি অভ্যন্তরীণ অভিধানের ডেটা কাঠামোর একটি মূল অংশ। এটির অনুমতি দেওয়ার জন্য, ধারকটিকে তার ডেটার জন্য একাধিক সূচি বজায় রাখতে হবে এবং অভিধানগুলি এটি করে না।
কনরাড রুডলফ

21
var myDic = new Dictionary<string, string>(StringComparer.InvariantCultureIgnoreCase);
myDic.Add("HeLlo", "hi");

if (myDic.ContainsKey("hello"))
    Console.WriteLine(myDic["hello"]);

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

14

আপনার অভিধানের সাথে ডিলের সম্ভাবনা রয়েছে যা 3 য় পক্ষ বা বাহ্যিক dll থেকে টানা হয়েছে few লিনাক ব্যবহার করে

YourDictionary.Any(i => i.KeyName.ToLower().Contains("yourstring")))


3
এটি দুর্দান্ত কাজ করে। সাবধানতা একটি শব্দ যদিও, যদি আপনি পরিবর্তন Anyকরতে SingleOrDefaultআপনি পাবেন না nullযদি এটা কোন অস্তিত্ব নেই পিছনে, এর পরিবর্তে আপনি উভয় কী এবং মান সেট দিয়ে একটি keyvaluepair পাবেন null!
নিবল্বিপিগ

1
Containsআপনি যে সময়ে সেই সময়ে কাজ করছিলেন এমন কোনও কিছুকে ব্যবহারের ক্ষেত্রে খুব সুনির্দিষ্ট মনে হয়। আরও জেনেরিক সহায়ক উত্তর হিসাবে, আমি মনে করি Equalsএটি আরও ভাল। এবং সেই একই নোটে, স্ট্রিংটির সাথে সদৃশ করার পরিবর্তে ToLower()এটি ব্যবহার করা আরও ভাল StringComparison.xxxCase
সুমেরে

1
এটি খুব দরকারী ছিল এবং টোলওয়ার থেকে মুক্তি পাওয়ার বিষয়টি অবশ্যই একটি উন্নতি - আমার ব্যবহারের ক্ষেত্রেটি ছিল: অ্যাপ্লাইডবফস.এই (বি => বি.কি.ইকুইলস (নাম, স্ট্রিংকম্পিয়ার.অর্ডিনালআইগনরেসেস)) ফেরান; একটি নিখুঁত কেস-সংবেদনশীল অভিধানের ক্ষেত্রে সংবেদনশীল অভিধান থাকে।
ডেভিড বারফোর্ড

আমি এটাকে নিচু করে ফেলছি। সাবধানতার কথা, আপনি যদি অভিধানের মালিক হন তবে এটি অবশ্যই এটি করার উপায় নয়। অভিধানটি কীভাবে ইনস্ট্যান্ট করা হয়েছিল তা যদি আপনি জানেন না তবে কেবলমাত্র এই পদ্ধতির ব্যবহার করুন। তারপরেও, স্ট্রিংয়ের সঠিক মিলের জন্য (কেবল অংশের মিল নয়), ব্যবহারের dict.Keys.Contains("bla", appropriate comparer)সহজতার জন্য লিনকিউ ওভারলোড ব্যবহার করুন।
নওফাল

1

আমি ঠিক একই ধরণের সমস্যায় পড়েছি যেখানে আমার একটি এএসপি.নেট কোর নিয়ামকের ক্ষেত্রে সংবেদনশীল অভিধানের দরকার পড়ে।

আমি একটি এক্সটেনশন পদ্ধতি লিখেছি যা কৌশলটি করে। অন্যদের জন্যও এটি সহায়ক হতে পারে ...

public static IDictionary<string, TValue> ConvertToCaseInSensitive<TValue>(this IDictionary<string, TValue> dictionary)
{
    var resultDictionary = new Dictionary<string, TValue>(StringComparer.InvariantCultureIgnoreCase);
    foreach (var (key, value) in dictionary)
    {
        resultDictionary.Add(key, value);
    }

    dictionary = resultDictionary;
    return dictionary;
}

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

myDictionary.ConvertToCaseInSensitive();

তারপরে অভিধান থেকে একটি মান পান:

myDictionary.ContainsKey("TheKeyWhichIsNotCaseSensitiveAnymore!");

0

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

public class CaseInSensitiveDictionary<TValue> : Dictionary<string, TValue>
{
    public CaseInSensitiveDictionary() : base(StringComparer.OrdinalIgnoreCase){}
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.