三元运算符难以阅读

时间:2016-06-22 08:30:28

标签: c# conditional-operator

有关如何使以下查询更具“可读性”的任何建议吗?

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

用条件和价值的长代码难以阅读。

1 个答案:

答案 0 :(得分:5)

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

<强>压痕

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

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

if,else

您还可以将这些三元运算符转换为ifelse更易读的链。

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&LT;&GT;

一种选择是编写自己的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())