আমি নাল পরীক্ষা করার চেষ্টা করেছি কিন্তু সংকলক সতর্ক করে যে এই অবস্থাটি কখনই ঘটবে না। আমার কী সন্ধান করা উচিত?
আমি নাল পরীক্ষা করার চেষ্টা করেছি কিন্তু সংকলক সতর্ক করে যে এই অবস্থাটি কখনই ঘটবে না। আমার কী সন্ধান করা উচিত?
উত্তর:
ধরে নিই যে কীটি উপস্থিত থাকলে আপনি মানটি পেতে চান , ব্যবহার করুন 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
))
ContainsKey
যা সত্য, কারণ এটির পাশাপাশি মানও বের করতে হবে। যদিও এটি দুটি অনুসন্ধান করছে না।
অভিধানে KeyNotFound
আপনার কীটি নেই এমন ঘটনাতে অভিধান একটি ব্যতিক্রম ছুঁড়ে দেয় ।
প্রস্তাবিত হিসাবে, ContainsKey
যথাযথ সতর্কতা। TryGetValue
কার্যকর।
এটি অভিধানটিকে নালটির মান আরও কার্যকরভাবে সঞ্চয় করতে দেয়। এটি এ জাতীয় আচরণ না করে, [অপারেটরের কাছ থেকে নাল ফলাফলের জন্য পরীক্ষা করা একটি নাল মান বা ইনপুট কী-এর অস্তিত্বের ইঙ্গিত দেয় যা ভাল নয়।
আপনি যদি নতুন মান যুক্ত করার চেষ্টা করছেন কেবল আগে, পরীক্ষা করুন ContainsKey
:
if (!openWith.ContainsKey("ht"))
{
openWith.Add("ht", "hypertrm.exe");
}
আপনি যদি মানটি পরীক্ষা করে TryGetValue
দেখছেন তবে জন স্কিটির উত্তরে বর্ণিত পদ্ধতিটি ব্যবহার করুন ।
GetValueElseAdd
পদ্ধতি রয়েছে যা আপনি Func<TValue>
সন্নিবেশের উপর রেজোলিউশনটি সংরক্ষণ করতে যদি একটি মান (বা ক ) দিয়ে থাকেন তবে যদি এটি না থাকে তবে যোগ করতে চলেছেন। আমি কারণ hasnt .NET লিব সেটিকে তৈরি অনুমান করা হয়, কারণ যোগ পথ কম ঘন ঘন আপনি একটি ক্যাশে stylee] এ এটি ব্যবহার করছি
TryGetValue
ভাল হবে, কিন্তু আপনি যদি অভিধান অর্ডার ডুপ্লিকেট সংযোজন এড়ানোর জন্য কী আছে চেক করতে চান, আমি বলতে হবে ContainsKey
শুধু ভাল হিসাবে (যদি ভাল না) হয়।
মানটি বের করার চেষ্টা করার আগে আপনার অভিধানটি পরীক্ষা করা উচিত 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.
}
TryGetValue
। ধন্যবাদ, আমি এখনই করছি, তাই আমি ভবিষ্যতে জানতে পারি। আমি এই উত্তরটি অক্ষত রাখতে যাচ্ছি, যদিও 'আলোচনা আলোচনা মূল্যবান।
TryGetValue
ল্যাম্বডা অভিব্যক্তিটি ব্যবহার করতে পারবেন না । যদিও এটি আমাকে ভাবায় যে সি # তে নতুন এক্সটেনশানটি কোয়েলসিং অপারেটরের catch
অনুরূপ null
অপারেটর হবে।
একটি সহায়ক শ্রেণি সুবিধাজনক:
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;
}
}
কন্টেনস্কি যা আপনি খুঁজছেন তা।
আপনার সম্ভবত ব্যবহার করা উচিত:
if(myDictionary.ContainsKey(someInt))
{
// do something
}
যে কারণে আপনি নালটি পরীক্ষা করতে পারবেন না তা হ'ল এখানে কীটি একটি মান ধরণের।
int result= YourDictionaryName.TryGetValue(key, out int value) ? YourDictionaryName[key] : 0;
কীটি অভিধানে উপস্থিত থাকলে এটি কীটির মান প্রদান করে অন্যথায় এটি 0 প্রদান করে।
আশা করি, এই কোডটি আপনাকে সহায়তা করবে।
TryGetValue
যথেষ্ট, value
পরিবর্তে ব্যবহার করুনresult
এই নির্দিষ্ট অভিধানটি 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;
}
}
তারপরে আপনি এই অভিধানটির আচরণ পরিচালনা করতে পারেন।
উদাহরণস্বরূপ এখানে: অভিধানে কীটি না থাকলে এটি আপনার পরামিতি দ্বারা পাস করা কীটি দেয়।