Je travaille avec l'API gérée des services Web Exchange, avec les 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 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 .ToString()
) et qu'elle n'existe pas, une exception est levée:
500
La clé donnée n'était pas présente dans le dictionnaire.
Comment puis-je refactoriser ce code pour aspirer moins (tout en étant fonctionnel)?
la source
TryGetValue
approche semble être la meilleure solution, car j'ai trouvé cette page: goo.gl/7YN6 ... mais je ne sais pas comment l'utiliser. Dans mon code ci-dessus,row
est un objet 'DataRow`, donc je ne suis pas sûr que votre exemple de code soit correct, cependant ...c.PhysicalAddresses.TryGetValue(c.PhysicalAddresses[PhysicalAddressKey.Home].Street, row["HomeStreet"]);
C# 7.0
)row["HomeStreet"] = c.PhysicalAddresses.TryGetValue(PhysicalAddressKey.Home, out PhysicalAddressEntry entry) ? entry.Street.ToString() : null;
Quel est le type de
c.PhysicalAddresses
? Si c'est le casDictionary<TKey,TValue>
, vous pouvez utiliser laContainsKey
méthode.la source
PhysicalAddressDictionary.TryGetValue
la source
J'utilise un dictionnaire et en raison de la répétitivité et des clés manquantes possibles, j'ai rapidement corrigé une petite méthode:
L'appeler:
Obtient le travail.
la source
Voici un petit quelque chose que j'ai concocté aujourd'hui. Semble fonctionner 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 pour l'ajouter réellement. J'espère que cela fonctionne pour toi
la source