如何缩短这种C#方法?

时间:2015-09-13 05:24:36

标签: c# conditional

我有两个List对象,每个Person都有一个索引排名,其中一个应排在第一行。两个列表分别从低到高排序。目前,我没有机会创建两个样本列表来自行测试,我不想停止编码,所以我想我会在这里提出一个相对快速的回复。 / p>

public void ConsolidateLists()
    {
        while(training.Count > 0 || testing.Count > 0)
        {
            if(training.Count == 0)
            {
                Controller.GrabFromList(output, testing);
            }
            else if(testing.Count == 0)
            {
                Controller.GrabFromList(output, training);
            }
            else if(training[0].Index < testing[0].Index)
            {
                Controller.GrabFromList(output, training);
            }
            else
            {
                Controller.GrabFromList(output, testing);
            }
        }
    }

public static void GrabFromList(List<Person> output, List<Person> target)
    {
        output.Add(target.First());
        target.RemoveAt(0);
    }

条件检查非常难看。结合我的陈述是否安全,

if(training.Count == 0 || testing[0] < training[0]) 
{
    Controller.GrabFromList(output, testing);
}

或者这会引发错误,因为它可能的训练[0]为空?如果第一个条件在||中已经为True,C#是否退出条件检查比较

4 个答案:

答案 0 :(得分:1)

是的,如果c#操作中的第一个语句结果为true,则||会忽略后续条件。

因此,如果training.Count == 0检查结果为真,则在以下情况下,testing[0] < training[0]检查

if(training.Count == 0 || testing[0] < training[0]) 
{
    Controller.GrabFromList(output, testing);
}

答案 1 :(得分:0)

通常,您必须经常查看此null。如果第一个条件是true,它将停止评估,但如果不是,那么它将停止评估?

至于逻辑,我认为你可以做output.AddRange(training); output.AddRange(testing)。因为,只看while(training.Count > 0 || testing.Count > 0)我看到两个列表都只是插入第三个。

如果对结果列表应用了一些排序条件,请对它们进行语言描述,然后我将能够为您提供代码片段以对其进行排序。你的条件中的逻辑似乎已经被打破了,我不知道要猜的是什么,你究竟是什么意思。

答案 2 :(得分:0)

我分析了不同的选项,这就是我如何简化逻辑:

public void ConsolidateLists()
{
    while (training.Count > 0 || testing.Count > 0)
    {
        if (training.Count > 0 && (testing.Count == 0 ^ training[0].Index < testing[0].Index))
        {
            Controller.GrabFromList(output, training);
        }
        else
        {
            Controller.GrabFromList(output, testing);
        }
    }
}

内联是否以牺牲易读性为代价进一步减少它:

public void ConsolidateLists()
{
    while (training.Count > 0 || testing.Count > 0)
        Controller.GrabFromList(output, training.Count > 0 && (testing.Count == 0 ^ training[0].Index < testing[0].Index) ? training : testing);
}

或检查相反的情况:

public void ConsolidateLists()
{
    while (training.Count > 0 || testing.Count > 0)
    {
        if (training.Count == 0 || (testing.Count > 0 && training[0].Index >= testing[0].Index))
        {
            Controller.GrabFromList(output, testing);
        }
        else
        {
            Controller.GrabFromList(output, training);
        }
    }
}

再次,内联是否以牺牲易读性为代价进一步减少它:

public void ConsolidateLists()
{
    while (training.Count > 0 || testing.Count > 0)
        Controller.GrabFromList(output, training.Count == 0 || (testing.Count > 0 && training[0].Index >= testing[0].Index) ? testing : training);
}

我没有尝试过代码,甚至可能无法编译,我把它留给你。 ;)

答案 3 :(得分:0)

您必须考虑可读性和效率。其他答案不完整,有点难以阅读。以下是您修改的代码,以包含所有必需的检查:

public void ConsolidateLists()
{
    while(training.Count > 0 || testing.Count > 0)
    {
        if(training.Count == 0 || training[0] == null)
        {
            Controller.GrabFromList(output, testing);
        }
        else if(testing.Count == 0 || testing[0] == null)
        {
            Controller.GrabFromList(output, training);
        }
        else if(training[0].Index < testing[0].Index)
        {
            Controller.GrabFromList(output, training);
        }
        else
        {
            Controller.GrabFromList(output, testing);
        }
    }
}

public static void GrabFromList(List<Person> output, List<Person> target)
{
    if (target[0] != null)
        output.Add(target[0]);
    target.RemoveAt(0);
}

我在GrabFromList方法中检查null,因为我猜你不想在输出中添加空值。我还删除了First()扩展方法,转而使用索引器。 First()会实例化一个枚举器,移动到第一个项目,然后返回该项目。然后它必须最终被摧毁。索引器已经存在,因此节省了CPU时间和内存。如果您希望代码在垂直方向上更加紧凑,则可以删除大括号。