2011-08-18 85 views
2

我有這樣的代碼:嵌套三元運營商

_viewModel.PhoneDefault = user == null ? "" : 
    (string.IsNullOrEmpty(user.PhoneDay) ? 
     (string.IsNullOrEmpty(user.PhoneEvening) ? 
      (string.IsNullOrEmpty(user.Mobile) ? "" : 
       user.Mobile) : 
      user.PhoneEvening) : 
     user.PhoneDay); 

有沒有更好的方式來寫這使其更具可讀性?

+20

避免嵌套ternaries必將使代碼更易讀一行內 – kjetilh

+0

你有沒有考慮過使用「開關」? –

回答

8

你的情況,你可以寫一個輔助函數,就像這樣:

// return the first parameter that isn't null or empty 
public static string CoalesceStrings(params string[] src) 
{ 
    foreach (var str in src) 
     if (!string.IsNullOrEmpty(str)) 
      return str; 
    return ""; 
} 

然後,只需調用它,就像這樣:

_viewModel.PhoneDefault = user == null ? "" : 
    CoalesceStrings(user.PhoneDay, user.PhoneEvening, user.Mobile); 
6

寫一個單獨的方法來獲取電話號碼,這樣的事情:

public string GetDefaultPhone(User user) 
     { 
      if(user == null) 
      { 
       return string.Empty; 
      } 

      if(!string.IsNullOrEmpty(user.PhoneDay)) 
      { 
       return user.PhoneDay; 
      } 

      if(!string.IsNullOrEmpty(user.PhoneEvening)) 
      { 
       return user.PhoneEvening; 
      } 

      if(!string.IsNullOrEmpty(user.Mobile)) 
      { 
       return user.Mobile; 
      } 

      return string.Empty; 
     } 

然後在你的代碼:

_viewModel.PhoneDefault = GetDefaultPhone(user); 
0

添加一些括號可能使其更具可讀性。你也可以把它分解成一系列if/else語句的

if (user != null) 
{ 
    if (!string.IsNullOrEmpty(user.PhoneDay)) 
    _viewModel.PhoneDefault = user.PhoneDay; 
    else if (!string.IsNullOrEmpty(user.PhoneEvening)) 
    _viewModel.PhoneDefault = user.PhoneEvening; 
    else if (!string.IsNullOrEmpty(user.Mobile)) 
    _viewModel.PhoneDefault = user.Mobile; 
    else 
    _viewModel.PhoneDefault = ""; 
} 
1

嘛,只要項目可以只是空或有效:

if (user == null) 
{ 
    _viewModel.PhoneDefault = String.Empty; 
} 
else 
{ 
    _viewModel.PhoneDefault = user.PhoneDay ?? user.PhoneEvening ?? user.Mobile ?? String.Empty; 
} 

你甚至可以在定義的擴展方法字符串將空字符串轉換爲null並在此處使用它,但我只是瘋了。

如果他們可以是一個空字符串,只需使用其他人的答案。傑森的方法很乾淨。

3

雖然我很喜歡Gabe的和弗拉基米爾的回答最多。這是一種使嵌套三元組看起來可辨認的方法。

_viewModel.PhoneDefault = 
    user == null 
    ? "" 
    : (string.IsNullOrEmpty(user.PhoneDay) 
    ? (string.IsNullOrEmpty(user.PhoneEvening) 
     ? (string.IsNullOrEmpty(user.Mobile) 
      ? "" 
     : user.Mobile) 
     : user.PhoneEvening) 
    : user.PhoneDay); 

當然,因爲你必須用圓括號包圍它們,這使得它更難做到這一點。在JavaScript中,它實際上非常優雅,因爲它允許嵌套的三元組沒有括號。雖然你的情況並不需要這種語法,但有時候這個語法非常方便。

2

現在,LINQ的力量,你可以把它簡單易讀像

_viewModel.PhoneDefault = user == null ? "" : 
(new [] {user.PhoneDay, user.PhoneEvening, user.Mobile}).FirstOrDefault(s => !string.IsNullOrEmpty(s)) ?? "";