В любом случае использовать оператор объединения 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;
} 
Другие вопросы по тегам