নামভ্যালু কালেকশনে কী উপস্থিত রয়েছে কিনা তা পরীক্ষা করুন


141

নেমভ্যালু কালেকশনে কোনও কীটি লুপ না করেই পরীক্ষা করে দেখার জন্য কি একটি দ্রুত এবং সহজ উপায় আছে?

ডিকশনারি.কন্টেনসকি () বা এর অনুরূপ কিছু খুঁজছেন।

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


আপনি কীটির উপর ভিত্তি করে একটি অনুসন্ধান করতে চাইলে কেবল অভিধানটি ব্যবহার করুন .... বিটিডাব্লু: আপনি এই শ্রেণিতে সূচক ব্যবহার করতে পারেন তবে এটি নিজেই লুপিং করবে - সুতরাং কোনও লাভ নেই
কার্স্টেন

উত্তর:


181

এমএসডিএন থেকে :

এই সম্পত্তি নিম্নলিখিত ক্ষেত্রে বাতিল করে:

1) নির্দিষ্ট কীটি পাওয়া না গেলে;

সুতরাং আপনি ঠিক করতে পারেন:

NameValueCollection collection = ...
string value = collection[key];
if (value == null) // key doesn't exist

2) যদি নির্দিষ্ট কীটি পাওয়া যায় এবং এর সাথে সম্পর্কিত মানটি শূন্য হয়।

collection[key]কল base.Get()তারপর base.FindEntry()যা অভ্যন্তরীণভাবে ব্যবহার Hashtableকর্মক্ষমতা হে (1) সঙ্গে।


37
এই সম্পত্তি নিম্নলিখিত ক্ষেত্রে বাতিল করে: 1) যদি নির্দিষ্ট কীটি পাওয়া যায় না; এবং 2) যদি নির্দিষ্ট কীটি পাওয়া যায় এবং এর সাথে সম্পর্কিত মানটি শূন্য হয়। এই সম্পত্তি দুটি ক্ষেত্রে পার্থক্য করে না।
স্টিভ


@ স্টিভ ওপি এই ধরণের সংঘর্ষের বিষয়ে কিছুই বলেন না।
আবাটিশচেভ

13
ডান @ বাতিশচেভ, তবে ওপি বলছে 'কী আছে কি না তা পরীক্ষা করে'। কী উপস্থিত না থাকায় নাল গ্রহণ করা সত্য নয়। সমঝোতা ছাড়া কোনও উত্তর নেই (কোনও লুপ নেই, খালি স্ট্রিং ব্যবহার করুন)
স্টিভ

@ বাতিষেভ যে 0সমান বলার মতো null... শ্রী
অ্যান্ড্রেস নিডেরমায়ার

54

এই পদ্ধতিটি ব্যবহার করুন:

private static bool ContainsKey(this NameValueCollection collection, string key)
{
    if (collection.Get(key) == null)
    {
        return collection.AllKeys.Contains(key);
    }

    return true;
}

এটি NameValueCollectionসংগ্রহে nullমান রয়েছে কি না তা নির্ভর করে এবং এটি সবচেয়ে কার্যকর ।


5
using System.Linq;এই সমাধানটি ব্যবহার করার সময় মনে রাখবেন ।
jhauberg

14

আমি মনে করি না যে এই উত্তরগুলির কোনওটিই সঠিক / অনুকূল। নেমভ্যালু কালেকশনটি কেবল নাল মান এবং অনুপস্থিত মানের মধ্যে পার্থক্য করে না, এটি এর কীগুলির ক্ষেত্রেও সংবেদনশীল নয়। সুতরাং, আমি মনে করি একটি সম্পূর্ণ সমাধান হবে:

public static bool ContainsKey(this NameValueCollection @this, string key)
{
    return @this.Get(key) != null 
        // I'm using Keys instead of AllKeys because AllKeys, being a mutable array,
        // can get out-of-sync if mutated (it weirdly re-syncs when you modify the collection).
        // I'm also not 100% sure that OrdinalIgnoreCase is the right comparer to use here.
        // The MSDN docs only say that the "default" case-insensitive comparer is used
        // but it could be current culture or invariant culture
        || @this.Keys.Cast<string>().Contains(key, StringComparer.OrdinalIgnoreCase);
}

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

12

হ্যাঁ, আপনি AllKeysসম্পত্তিটি পরীক্ষা করতে লিনক ব্যবহার করতে পারেন :

using System.Linq;
...
collection.AllKeys.Contains(key);

তবে Dictionary<string, string[]>এটি এই উদ্দেশ্যে আরও বেশি উপযুক্ত হবে, সম্ভবত এটি কোনও এক্সটেনশন পদ্ধতির মাধ্যমে তৈরি করা হয়েছে:

public static void Dictionary<string, string[]> ToDictionary(this NameValueCollection collection) 
{
    return collection.Cast<string>().ToDictionary(key => key, key => collection.GetValues(key));
}

var dictionary = collection.ToDictionary();
if (dictionary.ContainsKey(key))
{
   ...
}

1
এটি পুরো সংগ্রহটি লুপ করবে যা হে (এন)। যদিও collection[key]অভ্যন্তরীণভাবে ব্যবহারসমূহ Hashtableযা হে (1)
abatishchev

4
@ বাতিশচেভ প্রকৃতপক্ষে, collection[key]কীটি উপস্থিত না থাকা এবং সেই কীটির বিপরীতে নাল মান সংরক্ষণ করার মধ্যে কোনও পার্থক্য নেই।
ধনী ও'কেলি

এছাড়াও আপনি একটি মলিন হ্যাক প্রিফর্ম করতে পারেন এবং প্রতিচ্ছবিটি ব্যবহার করে হ্যাশটেবলের ব্যক্তিগত ক্ষেত্রটি পুনরুদ্ধার করতে পারেন।
আবাটিশ শেভ

আমি মনে করি এটি একটি সুন্দর নির্বোধ সমাধান। কেউ যদি নেমভ্যালিউ কালেকশন ব্যবহার করছেন তবে এটি সম্ভবত ডিকশনার সমর্থিত নয় এমন কারণে, যেমন নাল কী থাকা।
ক্রিস মেরিসিক

0

আপনি নামটি ব্যবহার করতে পারবেন Getএবং পরীক্ষার জন্য পরীক্ষা করতে পারবেন কারণ নেমভ্যালু কালেকশনটিতে নির্দিষ্ট কীটি না থাকলে nullপদ্ধতিটি ফিরে আসবে null

এমএসডিএন দেখুন ।


আপনাকে জানতে হবে indexএর keyপদ্ধতি ডাকতে। আপনি না?
আবাটিশচেভ

0

সংগ্রহের আকার যদি ছোট হয় তবে আপনি rich.okelly দ্বারা সরবরাহিত সমাধানটি নিয়ে যেতে পারেন। তবে, একটি বৃহত সংগ্রহের অর্থ হ'ল অভিধানের প্রজন্মটি কেবল কী সংগ্রহগুলি অনুসন্ধান করার চেয়ে ধীরে ধীরে ধীর হতে পারে।

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


0

এটি একটি নতুন পদ্ধতি প্রবর্তন না করেও সমাধান হতে পারে:

    item = collection["item"] != null ? collection["item"].ToString() : null;

0

আপনি যেমন রেফারেন্স উত্সগুলিতে দেখতে পাচ্ছেন, নেমভেলিউ কালেকশনটি নেমোবজেক্টক্লিকেশনবেস থেকে উত্তরাধিকার সূত্রে প্রাপ্ত

সুতরাং আপনি বেস-টাইপটি গ্রহণ করেন, প্রতিচ্ছবিটির মাধ্যমে ব্যক্তিগত হ্যাশটেবলটি পান এবং এতে কোনও নির্দিষ্ট কী রয়েছে কিনা তা পরীক্ষা করে দেখুন।

এটি মনোতেও কাজ করার জন্য, আপনাকে হ্যাশটবেলের নাম মনোতে কী আছে তা দেখতে হবে, এটি আপনি এখানে দেখতে পারেন (এম_আইটেমস কনটেনার), এবং মনো-ক্ষেত্র পাবেন, যদি প্রাথমিক ফিল্ডআইনফো নাল হয় (মনো - রানটাইম)।

এটার মত

public static class ParameterExtensions
{

    private static System.Reflection.FieldInfo InitFieldInfo()
    {
        System.Type t = typeof(System.Collections.Specialized.NameObjectCollectionBase);
        System.Reflection.FieldInfo fi = t.GetField("_entriesTable", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic);

        if(fi == null) // Mono
            fi = t.GetField("m_ItemsContainer", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic);

        return fi;
    }

    private static System.Reflection.FieldInfo m_fi = InitFieldInfo();


    public static bool Contains(this System.Collections.Specialized.NameValueCollection nvc, string key)
    {
        //System.Collections.Specialized.NameValueCollection nvc = new System.Collections.Specialized.NameValueCollection();
        //nvc.Add("hello", "world");
        //nvc.Add("test", "case");

        // The Hashtable is case-INsensitive
        System.Collections.Hashtable ent = (System.Collections.Hashtable)m_fi.GetValue(nvc);
        return ent.ContainsKey(key);
    }
}

অতি-খাঁটি অ-প্রতিবিম্বিত। নেট 2.0 কোডের জন্য, আপনি হ্যাশ-টেবিলটি ব্যবহার না করে কীগুলি দিয়ে লুপ করতে পারেন, তবে এটি ধীরে ধীরে।

private static bool ContainsKey(System.Collections.Specialized.NameValueCollection nvc, string key)
{
    foreach (string str in nvc.AllKeys)
    {
        if (System.StringComparer.InvariantCultureIgnoreCase.Equals(str, key))
            return true;
    }

    return false;
}

0

ভিবিতে এটি:

if not MyNameValueCollection(Key) is Nothing then
.......
end if

সি # তে কেবল হওয়া উচিত:

if (MyNameValueCollection(Key) != null) { }

যদি নিশ্চিত না এটা করা উচিত nullবা ""কিন্তু এই সাহায্য করা উচিত।


দুঃখিত যে এটি ভিবিতে রয়েছে। সি # কেবল হওয়া উচিত (মাইনেমভ্যালিউ কালেকশন (কী)! = নাল) {it এটি নাল বা "" হওয়া উচিত কিনা তা নিশ্চিত নয় তবে এটি অবশ্যই সহায়তা করবে।
কোডশহোল্ডবিসি

আমি বিশ্বাস করি যে সঠিক সিনট্যাক্সটি কোনও Dictionaryডেটা স্ট্রাকচারের অনুরূপ MyNameValueCollection[Key], এর চেয়ে বরং এর চেয়ে বেশি MyNameValueCollection(Key), যা কোনও পদ্ধতির কল আশা করে।
ব্লেয়ারজ 23

0

আমি এই সংগ্রহটি ব্যবহার করছি, যখন আমি ছোট উপাদান সংগ্রহে কাজ করেছি।

উপাদানগুলি যেখানে খুব বেশি সেখানে আমি "অভিধান" ব্যবহারের প্রয়োজন বলে মনে করি। আমার কোড:

NameValueCollection ProdIdes;
string prodId = _cfg.ProdIdes[key];
if (string.IsNullOrEmpty(prodId))
{
    ......
}

অথবা এটি ব্যবহার করা যেতে পারে:

 string prodId = _cfg.ProdIdes[key] !=null ? "found" : "not found";

0
queryItems.AllKeys.Contains(key)

সচেতন হন যে কীটি অনন্য হতে পারে না এবং তুলনাটি সাধারণত ক্ষেত্রে সংবেদনশীল is আপনি যদি প্রথম ম্যাচের কীটির মান পেতে চান এবং কেস সম্পর্কে বিরক্ত না হন তবে এটি ব্যবহার করুন:

        public string GetQueryValue(string queryKey)
        {
            foreach (string key in QueryItems)
            {
                if(queryKey.Equals(key, StringComparison.OrdinalIgnoreCase))
                    return QueryItems.GetValues(key).First(); // There might be multiple keys of the same name, but just return the first match
            }
            return null;
        }

-1
NameValueCollection n = Request.QueryString;

if (n.HasKeys())
   {
       //something
   }

রিটার্ন মানের ধরণ: সিস্টেম.বুলিয়ান সত্য যদি নামভ্যালু কালেকশনটিতে এমন কী থাকে যা শূন্য হয় না; অন্যথায়, মিথ্যা। LINK এ


2
যদিও এটি প্রশ্নের উত্তর দিতে পারে, কিছু ব্যাখ্যা প্রায়শই প্রশংসা করা হয়, বিশেষত এটি ব্যাখ্যা করার জন্য কীভাবে এটি অন্যান্য অনেক উত্তরের উত্তম বিকল্প হতে পারে।
প্যাক0

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