[英]C# iterate over two lists - exchangable inner / outer loop
I need to iterate over three lists and process each combination. 我需要迭代三个列表并处理每个组合。 Order of the most outer and second level loop (
list1
/ list2
) depends on some ordering rules. 最外层和第二层循环(
list1
/ list2
)的顺序取决于一些排序规则。 Moreover I have some logic before and after the last ( list3
) foreach loop. 此外,我在最后一个(
list3
)foreach循环之前和之后都有一些逻辑。 ProcesPair
method uses all three items and depends on their order. 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();
}
}
}
Is it possible to make it somehow more elegant? 是否有可能使它更优雅? I meen, how to reduce loops in code, something like
Zip
function but each with each other. 我看,如何减少代码中的循环,比如
Zip
函数,但每个都是相互的。
Nested loops are indicator for LINQ SelectMany
. 嵌套循环是LINQ
SelectMany
指示符。 Hence the equivalent of the sample code could be like this: 因此,示例代码的等价物可能是这样的:
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();
}
}
Or just refactor the repeating code into a separate method: 或者只是将重复代码重构为一个单独的方法:
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();
}
}
and then 接着
if (order == Order.Right)
ProcessPairs(list1, list2, list3);
else if (order == Order.Down)
ProcessPairs(list2, list1, list3);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.