2011-08-18 200 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)) ?? "";