এই অভিধান কীটি সি # তে উপস্থিত থাকলে আমি কীভাবে সনাক্ত করতে পারি?


497

আমি যোগাযোগের ডেটা সহ এক্সচেঞ্জ ওয়েব পরিষেবাদি পরিচালিত এপিআইয়ের সাথে কাজ করছি। আমার কাছে নিম্নলিখিত কোড রয়েছে যা কার্যকরী তবে আদর্শ নয়:

foreach (Contact c in contactList)
{
    string openItemUrl = "https://" + service.Url.Host + "/owa/" + c.WebClientReadFormQueryString;

    row = table.NewRow();
    row["FileAs"] = c.FileAs;
    row["GivenName"] = c.GivenName;
    row["Surname"] = c.Surname;
    row["CompanyName"] = c.CompanyName;
    row["Link"] = openItemUrl;

    //home address
    try { row["HomeStreet"] = c.PhysicalAddresses[PhysicalAddressKey.Home].Street.ToString(); }
    catch (Exception e) { }
    try { row["HomeCity"] = c.PhysicalAddresses[PhysicalAddressKey.Home].City.ToString(); }
    catch (Exception e) { }
    try { row["HomeState"] = c.PhysicalAddresses[PhysicalAddressKey.Home].State.ToString(); }
    catch (Exception e) { }
    try { row["HomeZip"] = c.PhysicalAddresses[PhysicalAddressKey.Home].PostalCode.ToString(); }
    catch (Exception e) { }
    try { row["HomeCountry"] = c.PhysicalAddresses[PhysicalAddressKey.Home].CountryOrRegion.ToString(); }
    catch (Exception e) { }

    //and so on for all kinds of other contact-related fields...
}

আমি যেমন বলেছি, এই কোডটি কাজ করে । এখন আমি যদি এটি সম্ভব হয় তবে কিছুটা কম স্তন্যপান করতে চাই ।

অভিধানে অ্যাক্সেস করার চেষ্টা করার আগে আমি কীটির কোনও অস্তিত্ব যাচাই করার অনুমতি দিয়েছি এবং আমি যদি এটি সহ পড়ার চেষ্টা করি (সাথে .ToString()) এবং এটি উপস্থিত না থাকে তবে একটি ব্যতিক্রম ছুঁড়ে দেওয়া হয়:

500
প্রদত্ত কী অভিধানে উপস্থিত ছিল না।

আমি কীভাবে এই কোডটি কম স্তন্যপান করতে পুনরায় চুলক করতে পারি (এখনও কার্যক্ষম থাকা অবস্থায়)?

উত্তর:


889

আপনি ব্যবহার করতে পারেন ContainsKey:

if (dict.ContainsKey(key)) { ... }

বা TryGetValue:

dict.TryGetValue(key, out value);

আপডেট : একটি মন্তব্য অনুসারে এখানে প্রকৃত শ্রেণিটি একটি IDictionaryনয় তবে একটি PhysicalAddressDictionary, সুতরাং পদ্ধতিগুলি Containsএবং TryGetValueতবে তারা একই পদ্ধতিতে কাজ করে।

ব্যবহারের উদাহরণ:

PhysicalAddressEntry entry;
PhysicalAddressKey key = c.PhysicalAddresses[PhysicalAddressKey.Home].Street;
if (c.PhysicalAddresses.TryGetValue(key, out entry))
{
    row["HomeStreet"] = entry;
}

আপডেট 2: এখানে ওয়ার্কিং কোড (প্রশ্নকারী দ্বারা সংকলিত)

PhysicalAddressEntry entry;
PhysicalAddressKey key = PhysicalAddressKey.Home;
if (c.PhysicalAddresses.TryGetValue(key, out entry))
{
    if (entry.Street != null)
    {
        row["HomeStreet"] = entry.Street.ToString();
    }
}

... প্রতিটি কী প্রয়োজনীয় হিসাবে অভ্যন্তরীণ শর্তসাপেক্ষে পুনরাবৃত্তি। ট্রাইগেটভ্যালু কেবল একবার শারীরিক অ্যাড্রেসকি (হোম, ওয়ার্ক, ইত্যাদি) দ্বারা করা হয়।


TryGetValueপদ্ধতির মত সেরা বাজি হতে পারে, যেহেতু আমি এই পৃষ্ঠাটি পাওয়া বলে মনে হয়: goo.gl/7YN6 ... কিন্তু আমি নিশ্চিত এটি কিভাবে ব্যবহার করতে নই। উপরের আমার কোডে, rowএকটি 'ডাটাআউজ অবজেক্ট', সুতরাং আমি নিশ্চিত নই যে আপনার উদাহরণ কোডটি ঠিক আছে, যদিও ...
অ্যাডাম

আমি এখানে কি ভুল করছি? c.PhysicalAddresses.TryGetValue(c.PhysicalAddresses[PhysicalAddressKey.Home].Street, row["HomeStreet"]);
অ্যাডাম টটল

1
@ অ্যাডাম টটল: দ্বিতীয় প্যারামিটারটি একটি আউট প্যারামিটার। আমি কোডটি অনুমান করার চেষ্টা করব যা আমার উত্তরটির সাথে কাজ করে এবং আপডেট করতে পারে তবে আমি ভুলগুলি ক্ষমা করতে হবে কারণ আমি এখানে সংকলন করতে পারছি না।
মার্ক বাইয়ার্স

ভাল উত্তর. এসওতে ধারাবাহিকতার জন্য, "প্রশ্ন জিজ্ঞাসাকারী" শব্দটি "ওপি" (মূল পোস্টারের জন্য সংক্ষিপ্ত) দ্বারা প্রতিস্থাপিত হতে পারে।
লভ লুস

একটি লাইনার (প্রয়োজনীয় C# 7.0)row["HomeStreet"] = c.PhysicalAddresses.TryGetValue(PhysicalAddressKey.Home, out PhysicalAddressEntry entry) ? entry.Street.ToString() : null;
ইভান গার্সিয়া টোপেট

12

কি ধরণের c.PhysicalAddresses? যদি এটি হয় Dictionary<TKey,TValue>তবে আপনি ContainsKeyপদ্ধতিটি ব্যবহার করতে পারেন ।


ধন্যবাদ, আদম, এটি সত্যই (সহায়ক নয়) সহায়ক। শ্রেণি শ্রেণিবিন্যাস কী? বেস টাইপ কি?
জন স্যান্ডার্স


3

আমি একটি অভিধান ব্যবহার করি এবং পুনরাবৃত্তি এবং সম্ভাব্য অনুপস্থিত কীগুলির কারণে আমি দ্রুত একটি ছোট পদ্ধতি একসাথে প্যাচ করেছি:

 private static string GetKey(IReadOnlyDictionary<string, string> dictValues, string keyValue)
 {
     return dictValues.ContainsKey(keyValue) ? dictValues[keyValue] : "";
 }

এটিকে কল করা:

var entry = GetKey(dictList,"KeyValue1");

কাজ হয়ে যায়।


1

আজ আমি কিছু রান্না করেছি something আমার জন্য কাজ করে বলে মনে হয়। মূলত আপনি একটি চেক করতে আপনার বেস নেমস্পেসে অ্যাড পদ্ধতিটি ওভাররাইড করেন এবং তারপরে এটি যুক্ত করার জন্য বেসের অ্যাড পদ্ধতিটি কল করুন। আশা করি এটি আপনার পক্ষে কাজ করে

using System;
using System.Collections.Generic;
using System.Collections;

namespace Main
{
    internal partial class Dictionary<TKey, TValue> : System.Collections.Generic.Dictionary<TKey, TValue>
    {
        internal new virtual void Add(TKey key, TValue value)
        {   
            if (!base.ContainsKey(key))
            {
                base.Add(key, value);
            }
        }
    }

    internal partial class List<T> : System.Collections.Generic.List<T>
    {
        internal new virtual void Add(T item)
        {
            if (!base.Contains(item))
            {
                base.Add(item);
            }
        }
    }

    public class Program
    {
        public static void Main()
        {
            Dictionary<int, string> dic = new Dictionary<int, string>();
            dic.Add(1,"b");
            dic.Add(1,"a");
            dic.Add(2,"c");
            dic.Add(1, "b");
            dic.Add(1, "a");
            dic.Add(2, "c");

            string val = "";
            dic.TryGetValue(1, out val);

            Console.WriteLine(val);
            Console.WriteLine(dic.Count.ToString());


            List<string> lst = new List<string>();
            lst.Add("b");
            lst.Add("a");
            lst.Add("c");
            lst.Add("b");
            lst.Add("a");
            lst.Add("c");

            Console.WriteLine(lst[2]);
            Console.WriteLine(lst.Count.ToString());
        }
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.