Ich arbeite mit der von Exchange Web Services verwalteten API mit Kontaktdaten. Ich habe den folgenden Code, der funktionsfähig , aber nicht ideal ist:
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...
}
Wie gesagt, dieser Code funktioniert . Jetzt möchte ich es , wenn möglich, etwas weniger lutschen lassen .
Ich kann keine Methoden finden, mit denen ich überprüfen kann, ob der Schlüssel im Wörterbuch vorhanden ist, bevor ich versuche, darauf zuzugreifen. Wenn ich versuche, ihn (mit .ToString()
) zu lesen und er nicht vorhanden ist, wird eine Ausnahme ausgelöst:
500
Der angegebene Schlüssel war im Wörterbuch nicht vorhanden.
Wie kann ich diesen Code umgestalten, um weniger zu saugen (während ich noch funktionsfähig bin)?
quelle
TryGetValue
Ansatz scheint die beste Wahl zu sein , da ich diese Seite gefunden habe: goo.gl/7YN6 ... aber ich bin mir nicht sicher, wie ich ihn verwenden soll. In meinem obigen Coderow
befindet sich ein 'DataRow'-Objekt, daher bin ich mir nicht sicher, ob Ihr Beispielcode richtig ist ...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;
Was ist die Art von
c.PhysicalAddresses
? WennDictionary<TKey,TValue>
ja, können Sie dieContainsKey
Methode verwenden.quelle
PhysicalAddressDictionary.TryGetValue
quelle
Ich benutze ein Wörterbuch und habe wegen der Wiederholbarkeit und möglicherweise fehlenden Schlüsseln schnell eine kleine Methode zusammengefügt:
Nennen wir es:
Erledigt die Arbeit.
quelle
Hier ist etwas, das ich mir heute ausgedacht habe. Scheint für mich zu arbeiten. Grundsätzlich überschreiben Sie die Add-Methode in Ihrem Basis-Namespace, um eine Überprüfung durchzuführen, und rufen dann die Add-Methode der Basis auf, um sie tatsächlich hinzuzufügen. Hoffe das funktioniert bei dir
quelle