三元运算符难读

Ternary operator difficult to read

有什么建议可以使下面的查询更多"readable"?

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);

如果,否则

您还可以将这些三元运算符变成更易读的 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<>

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