В любом случае использовать оператор объединения NULL для упрощения этого кода?
У меня есть этот кусок кода:
Phone addrFax = address.Phones.Phone.SingleOrDefault(p => p.PhoneType == PhoneTypeEnum.Fax);
if (addrFax != null)
tba.Fax = addrFax.PhoneNumber;
Это повторяется несколько раз для различных значений PhoneType. Все это безобразно.
Я играл с оператором объединения NULL (??), пытаясь упростить код следующим образом, но он не работает.
tab.Fax = address.Phones.Phone.SingleOrDefault(p => p.PhoneType == PhoneTypeEnum.Fax).PhoneNumber ?? "";
Есть ли способ конвертировать то, что у меня есть, в однострочник, который немного легче усваивается?
3 ответа
Решение
Как насчет следующего?
tba.Fax = address.Phones.Phone.Where(p => p.PhoneType == PhoneTypeEnum.Fax)
.Select(p => p.Fax)
.SingleOrDefault() ?? string.Empty;
Нет, вы пока не можете этого сделать, но в C#6 идет монадическая проверка нуля. Тогда вы можете написать
tab.Fax = address.Phones.Phone.SingleOrDefault(p => p.PhoneType == PhoneTypeEnum.Fax)?.PhoneNumber ?? "";
Обратите внимание на ?.
до PhoneNumber
Phone addrFax = address.Phones.Phone.Any(p => p.PhoneType == PhoneTypeEnum.Fax) ?
address.Phones.Phone.Single(p => p.PhoneType == PhoneTypeEnum.Fax).PhoneNumber : string.empty
Почему вы не хотите определить отдельную функцию?
Phone addrFax = GetPhone(address.Phones.Phone, PhoneTypeEnum.Fax)
public string GetPhone(PhoneTypeEnum phontype, IEnumerable<Phone> phones)
{
return phones.Any(p => p.PhoneType == phontype) ? phones.Single(p => p.PhoneType == phontype).PhoneNumber : string.Empty;
}