我需要在三个列表上迭代并处理每个组合。最外部和第二级循环(list1
/list2
)的顺序取决于某些订购规则。此外,我在最后一个(list3
)foreach循环之前和之后都有一些逻辑。 ProcesPair
方法使用所有三个项目,并取决于其顺序。
if (order == Order.Right)
{
foreach (var a in list1)
{
foreach (var b in list2)
{
DoSomethingBefore();
foreach (var c in list3)
{
ProcessPair(a, b, c);
}
DoSomethingAfter();
}
}
}
else if (order == Order.Down)
{
foreach (var b in list2)
{
foreach (var a in list1)
{
DoSomethingBefore();
foreach (var c in list3)
{
ProcessPair(a, b, c);
}
DoSomethingAfter();
}
}
}
有可能使其更优雅吗?我,如何减少代码中的循环,类似于Zip
功能,但彼此之间的循环。
嵌套循环是LINQ SelectMany
的指示器。因此,相当于示例代码的等效物可能是这样:
var pairs =
order == Order.Right ? list1.SelectMany(a => list2, (a, b) => new { a, b }) ?
order == Order.Down ? list2.SelectMany(b => list1, (b, a) => new { a, b }) :
null;
if (pairs != null)
{
foreach (var pair in pairs)
{
DoSomethingBefore();
foreach (var c in list3)
{
ProcessPair(pair.a, pair.b, c);
}
DoSomethingAfter();
}
}
或只是将重复代码重构为单独的方法:
void ProcessPairs(List<int> list1, List<int> list2, List<int> list3)
{
foreach (var a in list1)
foreach (var b in list2)
{
DoSomethingBefore();
foreach (var c in list3)
ProcessPair(a, b, c);
DoSomethingAfter();
}
}
,然后
if (order == Order.Right)
ProcessPairs(list1, list2, list3);
else if (order == Order.Down)
ProcessPairs(list2, list1, list3);