C# 中是否存在允许抽象循环(或其他)“外部”处理的语言结构?
我有一个相当直接的嵌套结构(例如整数列表的列表)以及通过每个最低级别的整数“旋转”的代码。代码并不复杂(也不是特别长),但我有多个函数需要独立地与最低级别“交互”,并且只是复制循环骨架来执行此操作。对我来说似乎是一种浪费。
foreach (list in outerlists)
... a few random lines of structure traversing
foreach (int in list)
do something simple to int
这显然是一个按比例缩小的示例,但我的现实世界是相似的 - 我最终重复复制外部处理以更改相对较少的内部工作线。
我的暂定解决方案是创建一个包含循环的“处理”方法,并采用枚举(或其他)参数来告诉它要调用哪个内部函数。然后在“做某事”级别放置一个 switch 语句来调用正确的子函数。
我走在正确的道路上还是有更简单的方法?我可以使用函数指针的概念摆脱 switch 语句(只需将函数指针传递到处理循环并在执行某些操作级别调用它),但不知道这在 C# 中是否可行?
最佳答案
(详细阐述 Oded 的回答)
假设您总是希望以相同的方式进行迭代,并且复制粘贴的 foreach 之间唯一的不同是最里面的嵌套 block ,那么您可以将所有循环封装到一个方法中:
public void DoStuffOnInnerElements (Action<int> theStuffToDo)
{
foreach (var subList in outerLists)
{
// a few random lines here...
foreach (int item in subList)
{
theStuffToDo(item);
}
}
}
操作可以是 C# 接受的任何格式 delegates (委托(delegate)是 C# 对 C/C++ 函数指针的回答):
// Lambdas
DoStuffOnInnerElements((i) => Console.WriteLine(i));
// Methods
DoStuffOnInnerElements(My_Void_xxx_Int_Method);
DoStuffOnInnerElements(new Action<int>(Console.WriteLine));
// anonymous delegates
DoStuffOnInnerElements(delegate(int i) { Console.WriteLine(i); });
// etc.
关于c# - 分解骨架处理 (C#),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4441013/