我有两个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#是否退出条件检查比较
答案 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时间和内存。如果您希望代码在垂直方向上更加紧凑,则可以删除大括号。