Estou trabalhando com a API gerenciada de serviços Web do Exchange, com dados de contato. Eu tenho o seguinte código, que é funcional , mas não 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 eu disse, esse código funciona . Agora eu quero fazê-lo chupar um pouco menos , se possível.
Não consigo encontrar nenhum método que permita verificar a existência da chave no dicionário antes de tentar acessá-la, e se eu tentar lê-la (com .ToString()
) e ela não existir, uma exceção será lançada:
500
A chave fornecida não estava presente no dicionário.
Como refatorar esse código para sugar menos (enquanto ainda está funcionando)?
fonte
TryGetValue
abordagem parece ser a melhor aposta, já que encontrei esta página: goo.gl/7YN6 ... mas não tenho certeza de como usá-la. No meu código acima,row
é um 'objeto DataRow`, então eu não tenho certeza do seu código exemplo é certo, porém ...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;
Qual é o tipo de
c.PhysicalAddresses
? Se forDictionary<TKey,TValue>
, então você pode usar oContainsKey
métodofonte
PhysicalAddressDictionary.TryGetValue
fonte
Eu uso um dicionário e, devido à repetibilidade e às possíveis chaves ausentes, rapidamente remendei um pequeno método:
Chamando:
Faz o trabalho.
fonte
Aqui está uma coisinha que eu preparei hoje. Parece funcionar para mim. Basicamente, você substitui o método Add no espaço de nomes base para fazer uma verificação e depois chama o método Add da base para realmente adicioná-lo. Espero que funcione para voce
fonte