如何缩短这种C#方法?

如何缩短这种C#方法?,c#,conditional,C#,Conditional,我有两个列表对象,每个人都有一个索引排名,其中一个应该排在第一位。两个列表分别从低到高排序。目前,我没有机会自己创建两个示例列表来测试这一点,我也不想停止编码,所以我想在这里希望能得到相对快速的响应 public void ConsolidateLists() { while(training.Count > 0 || testing.Count > 0) { if(training.Count == 0)

我有两个列表对象,每个人都有一个索引排名,其中一个应该排在第一位。两个列表分别从低到高排序。目前,我没有机会自己创建两个示例列表来测试这一点,我也不想停止编码,所以我想在这里希望能得到相对快速的响应

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);
    }
public void ConsolidateLists()
{
while(training.Count>0 | | testing.Count>0)
{
如果(training.Count==0)
{
控制器。抓取列表(输出、测试);
}
else if(testing.Count==0)
{
Controller.GrabFromList(输出、培训);
}
else if(训练[0]。索引<测试[0]。索引)
{
Controller.GrabFromList(输出、培训);
}
其他的
{
控制器。抓取列表(输出、测试);
}
}
}
publicstaticvoidgrabbromlist(列表输出,列表目标)
{
Add(target.First());
target.RemoveAt(0);
}
有条件的检查非常难看。这样把我的陈述结合起来安全吗

if(training.Count == 0 || testing[0] < training[0]) 
{
    Controller.GrabFromList(output, testing);
}
if(training.Count==0 | |测试[0]
或者这是否会引发错误,因为训练[0]可能为空?如果第一个条件在| |比较中已经为真,C#是否退出条件检查?

是,
C#
忽略后续条件,如果第一个语句在
|
操作中结果为
True

因此,在下面的条件下,如果
training.Count==0
check results true,它将不会执行
testing[0]
check

if(training.Count == 0 || testing[0] < training[0]) 
{
    Controller.GrabFromList(output, testing);
}
if(training.Count==0 | |测试[0]
通常,您必须始终选中此
null
。如果第一个条件为
,它将停止计算,但如果不是呢

至于逻辑,我想你可以做
output.AddRange(training);output.AddRange(测试)
。因为,只要看看
while(training.Count>0 | | testing.Count>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)
        Controller.GrabFromList(output, training.Count == 0 || (testing.Count > 0 && training[0].Index >= testing[0].Index) ? testing : training);
}

我没有试过代码,它甚至可能无法编译,我把这件事留给你去做。;)
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);
}
public void ConsolidateLists()
{
while(training.Count>0 | | testing.Count>0)
{
if(training.Count==0 | | training[0]==null)
{
控制器。抓取列表(输出、测试);
}
else if(testing.Count==0 | | testing[0]==null)
{
Controller.GrabFromList(输出、培训);
}
else if(训练[0]。索引<测试[0]。索引)
{
Controller.GrabFromList(输出、培训);
}
其他的
{
控制器。抓取列表(输出、测试);
}
}
}
publicstaticvoidgrabbromlist(列表输出,列表目标)
{
如果(目标[0]!=null)
output.Add(目标[0]);
target.RemoveAt(0);
}

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

“我自己没有机会创建两个示例列表来测试这一点,我也不想停止编码”:我感谢您的诚实,但这正是在询问StackOverflow问题之前您所期望的。。。首先你自己做一点努力。为什么if和else都包含相同的条件?请你解释一下。@PankajGupta-它们没有-一个是
培训
,另一个是
测试
“我自己没有机会创建两个样本列表来测试这个,我不想停止编码”,这不会让你走多远。。。您应该对您的代码负责,并对其进行充分的测试。否则你只是希望你是幸运的!除非为Person类型重载了<运算符,否则此代码不会编译。
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);
}