641 votes

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

Je suis en train de travailler avec les Services Web Exchange Managed API, avec des données de contact. J'ai le code suivant, qui est fonctionnel, mais pas idéal:

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...
}

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

Je ne peux pas trouver toutes les méthodes qui me permettent de vérifier l'existence de la clé dans le dictionnaire avant de tenter d'y accéder, et si j'essaie de le lire (avec .ToString()) et il n'existe pas, une exception est levée:

500
La clé donnée n'était pas présent dans le dictionnaire.

Comment puis-je refactoriser ce code à sucer moins (tout en restant fonctionnelle)?

1106voto

Mark Byers Points 318575

Vous pouvez utiliser ContainsKey:

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

ou TryGetValue:

dict.TryGetValue(key, out value);

Mise à jour: selon un commentaire de la classe réelle n'est pas ici une IDictionary mais PhysicalAddressDictionary, de sorte que les méthodes sont Contains et TryGetValue , mais ils 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 question asker)

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

...avec l'intérieur conditionnelle répété aussi souvent que nécessaire pour chaque clé. Le TryGetValue est effectuée une seule fois par PhysicalAddressKey (Maison, Travail, etc).

17voto

John Saunders Points 118808

Quel est le type de ? Si elle a , vous pouvez alors utiliser le `` méthode.

6voto

David Neale Points 8596

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X