Comment puis-je détecter si cette clé de dictionnaire existe en C #?

Je travaille avec l’API gérée par les services Web Exchange, avec des données de contact. J’ai le code suivant, qui est fonctionnel , mais pas idéal:

foreach (Contact c in contactList) { ssortingng openItemUrl = "https://" + service.Url.Host + "/owa/" + c.WebClientReadFormQuerySsortingng; 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.ToSsortingng(); } catch (Exception e) { } try { row["HomeCity"] = c.PhysicalAddresses[PhysicalAddressKey.Home].City.ToSsortingng(); } catch (Exception e) { } try { row["HomeState"] = c.PhysicalAddresses[PhysicalAddressKey.Home].State.ToSsortingng(); } catch (Exception e) { } try { row["HomeZip"] = c.PhysicalAddresses[PhysicalAddressKey.Home].PostalCode.ToSsortingng(); } catch (Exception e) { } try { row["HomeCountry"] = c.PhysicalAddresses[PhysicalAddressKey.Home].CountryOrRegion.ToSsortingng(); } catch (Exception e) { } //and so on for all kinds of other contact-related fields... } 

Comme je l’ai dit, ce code fonctionne . Maintenant, je veux le faire sucer un peu moins , si possible.

Je ne trouve aucune méthode qui me permette de vérifier l’existence de la clé dans le dictionnaire avant d’essayer d’y accéder, et si j’essaie de la lire (avec .ToSsortingng() ) et qu’elle n’existe pas alors une exception Est lancé:

500
La clé donnée n’était pas présente dans le dictionnaire.

Comment puis-je refactoriser ce code pour qu’il suce moins (tout en étant fonctionnel)?

    Vous pouvez utiliser ContainsKey :

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

    ou TryGetValue :

     dict.TryGetValue(key, out value); 

    Mise à jour : selon un commentaire, la classe actuelle n’est pas un IDictionary mais un PhysicalAddressDictionary , donc les méthodes sont Contains et TryGetValue mais elles fonctionnent de la même manière.

    Exemple d’utilisation:

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

    Mise à jour 2: voici le code de travail (compilé par le demandeur)

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

    … avec le conditionnel interne répété si nécessaire pour chaque clé requirejse. TryGetValue est uniquement effectuée une fois par PhysicalAddressKey (Home, Work, etc.).

    Quel est le type de c.PhysicalAddresses ? Si Dictionary , vous pouvez utiliser la méthode ContainsKey .

    PhysicalAddressDictionary.TryGetValue

      public bool TryGetValue ( PhysicalAddressKey key, out PhysicalAddressEntry physicalAddress ) 

    Voici un petit quelque chose que j’ai cuisiné aujourd’hui. Semble travailler pour moi. Fondamentalement, vous remplacez la méthode Add dans votre espace de noms de base pour effectuer une vérification, puis appelez la méthode Add de la base afin de l’append réellement. J’espère que cela fonctionne pour toi

     using System; using System.Collections.Generic; using System.Collections; namespace Main { internal partial class Dictionary : System.Collections.Generic.Dictionary { internal new virtual void Add(TKey key, TValue value) { if (!base.ContainsKey(key)) { base.Add(key, value); } } } internal partial class List : System.Collections.Generic.List { internal new virtual void Add(T item) { if (!base.Contains(item)) { base.Add(item); } } } public class Program { public static void Main() { Dictionary dic = new Dictionary(); dic.Add(1,"b"); dic.Add(1,"a"); dic.Add(2,"c"); dic.Add(1, "b"); dic.Add(1, "a"); dic.Add(2, "c"); ssortingng val = ""; dic.TryGetValue(1, out val); Console.WriteLine(val); Console.WriteLine(dic.Count.ToSsortingng()); List lst = new List(); 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.ToSsortingng()); } } }