সি # ডিকশনারির <কী <<<<< কী কী থাকে না যদি কীটি বিদ্যমান না থাকে?


121

আমি নাল পরীক্ষা করার চেষ্টা করেছি কিন্তু সংকলক সতর্ক করে যে এই অবস্থাটি কখনই ঘটবে না। আমার কী সন্ধান করা উচিত?

উত্তর:


196

ধরে নিই যে কীটি উপস্থিত থাকলে আপনি মানটি পেতে চান , ব্যবহার করুন Dictionary<TKey, TValue>.TryGetValue:

int value;
if (dictionary.TryGetValue(key, out value))
{
    // Key was in dictionary; "value" contains corresponding value
} 
else 
{
    // Key wasn't in dictionary; "value" is now 0
}

( ContainsKeyসূচকটি ব্যবহার করে এবং তারপরে সূচিদাতাকে এটিকে দু'বার চাবিটি আপ করে তোলে যা বেশ অর্থহীন))

লক্ষ্য করুন এমনকি যদি আপনি সেটা রেফারেন্স ধরনের ব্যবহার করে, নাল জন্য পরীক্ষা কাজ করবে না - indexer জন্য Dictionary<,>বরং নাল ফিরে চেয়ে, আপনি একটি অনুপস্থিত কী অনুরোধ যদি একটি ব্যতিক্রম নিক্ষেপ করা হবে। (এটি Dictionary<,>এবং এর মধ্যে একটি বড় পার্থক্য Hashtable))


@ জোনস্কিট কি ট্রাইগেটভ্যালু খুব দ্বৈত অনুসন্ধান করছে না ( যেমন এই প্রশ্নবিদ্ধারে বলা হয়েছে )?
নওফাল

5
@ নওফাল: আমি এমন কোনও ইঙ্গিত দেখছি না যে প্রশ্নটি মোটেই বলেছে। এটি বলে যে এটি এর চেয়ে বেশি কাজ করছে ContainsKeyযা সত্য, কারণ এটির পাশাপাশি মানও বের করতে হবে। যদিও এটি দুটি অনুসন্ধান করছে না।
জন স্কিটি

উদাসীনভাবে, আমি নালার প্রত্যাশা রেখেছিলাম, তবে অভিধান <টি কে, এনাম> এর জন্য, এটি এনামের মধ্যে "0" সমতুল্য দেয়।
জেস

23

অভিধানে KeyNotFoundআপনার কীটি নেই এমন ঘটনাতে অভিধান একটি ব্যতিক্রম ছুঁড়ে দেয় ।

প্রস্তাবিত হিসাবে, ContainsKeyযথাযথ সতর্কতা। TryGetValueকার্যকর।

এটি অভিধানটিকে নালটির মান আরও কার্যকরভাবে সঞ্চয় করতে দেয়। এটি এ জাতীয় আচরণ না করে, [অপারেটরের কাছ থেকে নাল ফলাফলের জন্য পরীক্ষা করা একটি নাল মান বা ইনপুট কী-এর অস্তিত্বের ইঙ্গিত দেয় যা ভাল নয়।


অতিরিক্ত তথ্য এমএসডিএন-তে পাওয়া যাবে: msdn.microsoft.com/en-gb/library/9tee9ht2.aspx
সাইবারযুক্ত

10

আপনি যদি নতুন মান যুক্ত করার চেষ্টা করছেন কেবল আগে, পরীক্ষা করুন ContainsKey:

if (!openWith.ContainsKey("ht"))
{
    openWith.Add("ht", "hypertrm.exe");
}

আপনি যদি মানটি পরীক্ষা করে TryGetValueদেখছেন তবে জন স্কিটির উত্তরে বর্ণিত পদ্ধতিটি ব্যবহার করুন ।


8
ট্রাইগেট আরও ভাল
রুবেন বারটেলিংক

2
আপনি যদি তাত্ক্ষণিকভাবে কন্টেন্টগুলি পরে পান তবে কোজ আপনি দুটি বার হ্যাশ টেবিলের মাধ্যমে কী লুকে সলভ করছেন। উইন্টেললেক্ট পাওয়ার সংগ্রহগুলিতে এমন GetValueElseAddপদ্ধতি রয়েছে যা আপনি Func<TValue>সন্নিবেশের উপর রেজোলিউশনটি সংরক্ষণ করতে যদি একটি মান (বা ক ) দিয়ে থাকেন তবে যদি এটি না থাকে তবে যোগ করতে চলেছেন। আমি কারণ hasnt .NET লিব সেটিকে তৈরি অনুমান করা হয়, কারণ যোগ পথ কম ঘন ঘন আপনি একটি ক্যাশে stylee] এ এটি ব্যবহার করছি
রুবেন Bartelink

@ আরব: আমি অনুমান করি যে কোডের উদ্দেশ্য উপর নির্ভর করে। আমি সম্মত আপনি মান ব্যবহার করতে চান তাহলে যে TryGetValueভাল হবে, কিন্তু আপনি যদি অভিধান অর্ডার ডুপ্লিকেট সংযোজন এড়ানোর জন্য কী আছে চেক করতে চান, আমি বলতে হবে ContainsKeyশুধু ভাল হিসাবে (যদি ভাল না) হয়।
ফ্রেড্রিক মার্ক

@ ফ্রেড্রিক: আপনি যদি কেবলমাত্র একটি ধারক চেক করতে চান তবে হ্যাঁ, এটি কনটেনস্কি ব্যবহার করার মতো। মনে রাখবেন যে এই উত্তরের নমুনা কোডে এটি নয়।
জন স্কিটি

@ জন: সত্য, আমি আসলে মিস করেছি যে যুক্ত হওয়া মূল্য যুক্ত হওয়ার সাথে সাথেই তা আনা হয়েছিল।
ফ্রেডরিক মার্ক

3

মানটি বের করার চেষ্টা করার আগে আপনার অভিধানটি পরীক্ষা করা উচিত K কনটেনসকি (ইন কী))

Dictionary<int, int> myDictionary = new Dictionary<int, int>();
myDictionary.Add(2,4);
myDictionary.Add(3,5);

int keyToFind = 7;
if(myDictionary.ContainsKey(keyToFind))
{
    myValueLookup = myDictionay[keyToFind];
    // do work...
}
else
{
    // the key doesn't exist.
}

2
আপনি কেন এটি দু'বার অনুসন্ধান করতে চান?
জন স্কিটি

2
@ মুকিড: আমার মতে নয়। ধারণাটি হ'ল কীটি সন্ধান করার চেষ্টা করা, এবং যদি এটি পাওয়া যায় তবে একটি পদক্ষেপ গ্রহণ করা, এবং অন্য কোনও ক্রিয়াকলাপ অন্যথায়, ঠিক?
জন স্কিটি

3
@ জন - সত্যই? কারণ আমি জানতাম না TryGetValue। ধন্যবাদ, আমি এখনই করছি, তাই আমি ভবিষ্যতে জানতে পারি। আমি এই উত্তরটি অক্ষত রাখতে যাচ্ছি, যদিও 'আলোচনা আলোচনা মূল্যবান।
জম্বিশিপ

@ জোন স্কিটি - এই কারণেই আমি এখানে আছি। :)
জম্বিশিপ

@ জোনস্কিট কারণ সি # 7 এর আগে আপনি TryGetValueল্যাম্বডা অভিব্যক্তিটি ব্যবহার করতে পারবেন না । যদিও এটি আমাকে ভাবায় যে সি # তে নতুন এক্সটেনশানটি কোয়েলসিং অপারেটরের catchঅনুরূপ nullঅপারেটর হবে।
নেটমেজ 15'17

1

একটি সহায়ক শ্রেণি সুবিধাজনক:

public static class DictionaryHelper
{
    public static TVal Get<TKey, TVal>(this Dictionary<TKey, TVal> dictionary, TKey key, TVal defaultVal = default(TVal))
    {
        TVal val;
        if( dictionary.TryGetValue(key, out val) )
        {
            return val;
        }
        return defaultVal;
    }
}

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

@ অ্যাডাহেস - এজন্য আপনার সি # তে হ্যাশটেবল () রয়েছে ... দুর্ভাগ্যক্রমে, আপনার কীগুলি সেখানে
বাক্স হয়ে গেছে


0

আপনার সম্ভবত ব্যবহার করা উচিত:

if(myDictionary.ContainsKey(someInt))
{
  // do something
}

যে কারণে আপনি নালটি পরীক্ষা করতে পারবেন না তা হ'ল এখানে কীটি একটি মান ধরণের।


1
মানটির ধরণটি কিছুটা অপ্রাসঙ্গিক, কারণ নাল পরীক্ষা করা পছন্দসই প্রভাব ফেলবে না।
জন স্কিটি

@ জোহানেস, জনের সমাধান অবশ্যই ভাল উপায়, তবে প্রশ্নকারী জিজ্ঞাসা করেছেন যে তিনি কীটি উপস্থিত আছেন কিনা তা পরীক্ষা করে দেখেন এবং এটি একটি অভিধান <int, int>, তাই কীটি এখানে একটি মান ধরণেরও।
রাজ্জি

0
int result= YourDictionaryName.TryGetValue(key, out int value) ? YourDictionaryName[key] : 0;

কীটি অভিধানে উপস্থিত থাকলে এটি কীটির মান প্রদান করে অন্যথায় এটি 0 প্রদান করে।

আশা করি, এই কোডটি আপনাকে সহায়তা করবে।


1
যদি কীটি বিদ্যমান থাকে তবে এই কোডটি দুটিবার সন্ধান করা হবে। TryGetValueযথেষ্ট, valueপরিবর্তে ব্যবহার করুনresult
ম্যাথিউ ভিআইএলএস

0

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

public static class NumbersAdapter
{
    private static readonly Dictionary<string, string> Mapping = new Dictionary<string, string>
    {
        ["1"] = "One",
        ["2"] = "Two",
        ["3"] = "Three"
    };

    public static string GetValue(string key)
    {
        return Mapping.ContainsKey(key) ? Mapping[key] : key;
    }
}

তারপরে আপনি এই অভিধানটির আচরণ পরিচালনা করতে পারেন।

উদাহরণস্বরূপ এখানে: অভিধানে কীটি না থাকলে এটি আপনার পরামিতি দ্বারা পাস করা কীটি দেয়।

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