কীভ্যালিউপায়ারের জন্য ডিফল্ট


392

আমি টাইপ একটি অবজেক্ট আছে IEnumerable<KeyValuePair<T,U>> keyValueList, আমি ব্যবহার করছি

 var getResult= keyValueList.SingleOrDefault();
 if(getResult==/*default */)
 {
 }
 else
 {
 } 

আমি কীভাবে getResultডিফল্ট কিনা তা খতিয়ে দেখতে পারি, যদি আমি সঠিক উপাদানটি খুঁজে না পাই?

এটি কিনা তা আমি যাচাই করতে পারি nullনা, কারণ KeyValuePairএটি স্ট্রাক্ট।


1
এখানে কিছু আকর্ষণীয় উত্তরের সাথে একটি অনুরূপ প্রশ্ন: স্ট্যাকওভারফ্লো.com
আন্দ্রে লুস

2
আপনি getResult.Key বলতে পারেন! = তালিকাটি শূন্য হয় কিনা তা যাচাই করার জন্য নাল যেন এটি কীটি সর্বদা শূন্য থাকবে
Pengibot

3
@ স্পেনগিবিট যা ধরে নেয় কীটি অবিচ্ছেদ্য।
জাস্টিন স্কাইলস

উত্তর:


542

এটা চেষ্টা কর:

if (getResult.Equals(new KeyValuePair<T,U>()))

অথবা এটা:

if (getResult.Equals(default(KeyValuePair<T,U>)))

5
আপনি এখানে "নতুন" বিকল্পের ধারণাটি ব্যবহার করতে পারেন, তবে প্রকারটি পুনরায় নির্দিষ্ট করে এড়িয়ে চলুন: যদি (getResult.Equals (Activator.CreateInstance (getResult.GetType ()))
কেভিনপো

3
আমার মনে হয় if (getResult.Equals(default))এটিও কাজ করে
সাইমন

2
@ সিমন না এটি করেনা। defaultনাল সমান। এবং default(KeyValuePair<T,U>)এটি রয়েছে এমন একটি আসল কীভ্যালিউপায়ার null, null। এটি আমি নিজেই অভিজ্ঞ।
যোকোভস্কি

100

আপনি এর মতো একটি সাধারণ (এবং জেনেরিক) এক্সটেনশন পদ্ধতি তৈরি করতে পারেন:

public static class Extensions
{
    public static bool IsDefault<T>(this T value) where T : struct
    {
        bool isDefault = value.Equals(default(T));

        return isDefault;
    }
}

ব্যবহার:

// We have to set explicit default value '0' to avoid build error:
// Use of unassigned local variable 'intValue'
int intValue = 0;
long longValue = 12;
KeyValuePair<String, int> kvp1 = new KeyValuePair<String, int>("string", 11);
KeyValuePair<String, int> kvp2 = new KeyValuePair<String, int>();
List<KeyValuePair<String, int>> kvps = new List<KeyValuePair<String, int>> { kvp1, kvp2 };
KeyValuePair<String, int> kvp3 = kvps.FirstOrDefault(kvp => kvp.Value == 11);
KeyValuePair<String, int> kvp4 = kvps.FirstOrDefault(kvp => kvp.Value == 15);

Console.WriteLine(intValue.IsDefault()); // results 'True'
Console.WriteLine(longValue.IsDefault()); // results 'False'
Console.WriteLine(kvp1.IsDefault()); // results 'False'
Console.WriteLine(kvp2.IsDefault()); // results 'True'
Console.WriteLine(kvp3.IsDefault()); // results 'False'
Console.WriteLine(kvp4.IsDefault()); // results 'True'

27

এটা চেষ্টা কর:

KeyValuePair<string,int> current = this.recent.SingleOrDefault(r => r.Key.Equals(dialog.FileName) == true);

if (current.Key == null)
    this.recent.Add(new KeyValuePair<string,int>(dialog.FileName,0));

3
অবশ্যই, এটি কেবল তখনই কাজ করে যদি আপনি কখনই (দুর্ঘটনাক্রমে বা উদ্দেশ্যমূলকভাবে) কোনও চাবি হিসাবে নাল যুক্ত করেন না। তবে আমি বলব যে এটি সময়ের বেশিরভাগ অংশই সত্য, তাই ভাল ধারণা। এটি অবশ্যই বেশিরভাগ চেকের চেয়ে এখানে সহজ চেক।
নিমিনেম

3
যতক্ষণ না চাবিটি অবিরাম হয়।
উরি আব্রামসন


8

আমি এক্সটেনশন পদ্ধতিটি ব্যবহার করে আরও বোঝার উপায়ের পরামর্শ দিচ্ছি:

public static class KeyValuePairExtensions
{
    public static bool IsNull<T, TU>(this KeyValuePair<T, TU> pair)
    {
        return pair.Equals(new KeyValuePair<T, TU>());
    }
}

এবং তারপরে কেবল ব্যবহার করুন:

var countries = new Dictionary<string, string>
{
    {"cz", "prague"},
    {"de", "berlin"}
};

var country = countries.FirstOrDefault(x => x.Key == "en");

if(country.IsNull()){

}

7

আপনার আসল কোড থেকে দেখে মনে হচ্ছে আপনি যা চান তা তালিকার খালি ছিল কিনা তা যাচাই করা:

var getResult= keyValueList.SingleOrDefault();
if (keyValueList.Count == 0)
{
   /* default */
}
else
{
}

ব্যবহৃত না হওয়ায় আপনি কেবল প্রথম লাইনটি বাদ দিতে পারেন।
ওহে জুড

0

বক্সিং এড়াতে KeyValuePair.Equals(object)আপনি একটি ব্যবহার করতে পারেন ValueTuple

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