c# - 三元运算符难读

标签 c# conditional-operator

有什么建议可以使下面的查询更“可读”吗?

var result = result
                .OrderBy(a =>
                    (conditionA) ?
                    valueA :
                    (conditionB ? valueB :
                    (conditionC ?
                    (conditionD ?
                    valueC : valueD) :
                    valueE)));

condition 和 value 的代码很长,很难阅读。

最佳答案

有多种方法可以提高代码的可读性。

缩进

一种方法是以稍微不同的方式缩进代码,但这只会稍微提高可读性:

var result = result.OrderBy(a =>
    conditionA ? valueA :
    conditionB ? valueB :
    conditionC ? conditionD ? valueC :
                              valueD :
                valueE);

如果,否则

您还可以将这些三元运算符转换为更具可读性的 if 链, else .

var result = Result.OrderBy(a => {
    if (conditionA)
    {
        return valueA;
    }
    else if (conditionB)
    {
        return valueB;
    }
    else if (conditionC)
    {
        if (conditionD)
        {
            return valueC;
        }
        else
        {
            return valueD;
        }
    }
    else
    {
        return valueE;
    }
});

IComparer<>

一个选择是编写您自己的 IComparer<> 实现并将其传递给 OrderBy方法。我不知道你的对象是什么类型或者代码中的键是什么类型,所以我假设 string键。

public class MyClassComparer : IComparer<MyClass>
{
    public int Compare(MyClass x, MyClass y)
    {
        string xKey = getKey(x);
        string yKey = getKey(y);
        return string.Compare(xKey, yKey);
    }

    private string getKey(MyClass item)
    {
        if (item.conditionA)
        {
            return item.valueA;
        }
        else if (item.conditionB)
        {
            return item.valueB;
        }
        else if (item.conditionC)
        {
            if (item.conditionD)
            {
                return item.valueC;
            } 
            else
            {
                return item.valueD;
            }
        }
        else
        {
            return item.valueE;
        }
    }
}

扩展方法

最后一个选择是将您的代码移动到扩展方法:

public static class MyClassExtensions
{
    public static string GetSortingKey(this MyClass item)
    {
        if (item.conditionA)
        {
            return item.valueA;
        }
        else if (item.conditionB)
        {
            return item.valueB;
        }
        else if (item.conditionC)
        {
            if (item.conditionD)
            {
                return item.valueC;
            } 
            else
            {
                return item.valueD;
            }
        }
        else
        {
            return item.valueE;
        }
    }
}

使用最后一个选项,您调用 OrderBy很简单:

result.OrderBy(a => a.GetSortingKey())

关于c# - 三元运算符难读,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37962581/

相关文章:

c# - 删除查询中的内部连接有那么糟糕吗?

c# - 可空类型问题 ? : Conditional Operator

java - 在语句中对 "0"使用三元运算符

带有 void 操作数的 C++ 条件运算符

c# - 是否可以在 Windows Phone 8 的键盘内添加完成按钮?

c# - 无法在 C# 代码中将 Azure 云存储帐户的公共(public)文件 URL 过期时间设置为超过 1 年

c# - 通用方法与强制转换

c# - 使用查询字符串获取当前 url

c++ - 条件运算符在 Windows 中成功编译但在 Linux 中出错

c# - 为什么条件运算符不能正确地允许使用 "null"来分配给可为 null 的类型?