嵌套的三元运算符

Kap*_*old 3 c# refactoring ternary-operator

我有这个代码:

_viewModel.PhoneDefault = user == null ? "" :
    (string.IsNullOrEmpty(user.PhoneDay) ?
        (string.IsNullOrEmpty(user.PhoneEvening) ?
            (string.IsNullOrEmpty(user.Mobile) ? "" : 
                user.Mobile) :
            user.PhoneEvening) :
         user.PhoneDay);
Run Code Online (Sandbox Code Playgroud)

是否有更好的方法来编写它以使其更具可读性?

Gab*_*abe 10

在您的情况下,您可以编写一个辅助函数,如下所示:

// 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 "";
}
Run Code Online (Sandbox Code Playgroud)

然后就这样打电话,就像这样:

_viewModel.PhoneDefault = user == null ? "" :
    CoalesceStrings(user.PhoneDay, user.PhoneEvening, user.Mobile);
Run Code Online (Sandbox Code Playgroud)


Jas*_*ans 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;
        }
Run Code Online (Sandbox Code Playgroud)

然后在你的代码中:

_viewModel.PhoneDefault = GetDefaultPhone(user);
Run Code Online (Sandbox Code Playgroud)


Luc*_*tal 6

只是回答,因为我没有在任何现有答案中看到我在这种情况下使用的方法。

关于什么...

_viewModel.PhoneDefault = user == null ? string.Empty :
    !string.IsNullOrEmpty(user.PhoneDay)     ? user.PhoneDay :
    !string.IsNullOrEmpty(user.PhoneEvening) ? user.PhoneEvening :
    !string.IsNullOrEmpty(user.Mobile)       ? user.Mobile : 
    string.Empty;
Run Code Online (Sandbox Code Playgroud)

您必须在开始时检查用户是否为空,这很不方便,因为这会强制重复string.Empty,但尽管如此,我认为它还是很有可读性的。

我的两分钱;)