Estoy trabajando con la API administrada de servicios web de Exchange, con datos de contacto. Tengo el siguiente código, que es funcional , pero no ideal:
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...
}
Como dije, este código funciona . Ahora quiero hacer que apesta un poco menos , si es posible.
No puedo encontrar ningún método que me permita verificar la existencia de la clave en el diccionario antes de intentar acceder a ella, y si intento leerla (con .ToString()
) y no existe, se produce una excepción:
500
La clave dada no estaba presente en el diccionario.
¿Cómo puedo refactorizar este código para absorber menos (sin dejar de ser funcional)?
fuente
TryGetValue
enfoque parece ser la mejor opción , ya que encontré esta página: goo.gl/7YN6 ... pero no estoy seguro de cómo usarla. En mi código anterior,row
es un 'objeto DataRow`, así que no estoy seguro de su código de ejemplo es correcta, aunque ...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;
¿De qué tipo es
c.PhysicalAddresses
? Si es asíDictionary<TKey,TValue>
, puedes usar elContainsKey
método.fuente
PhysicalAddressDictionary. TryGetValue
fuente
Utilizo un diccionario y debido a la repetitividad y las posibles teclas faltantes, rápidamente arreglé un pequeño método:
Llamándolo:
Hace el trabajo.
fuente
Aquí hay algo que cociné hoy. Parece funcionar para mi. Básicamente, usted anula el método Agregar en su espacio de nombres base para hacer una verificación y luego llama al método Agregar de la base para agregarlo realmente. Espero que esto funcione para usted
fuente