避免多个类似的foreach - C#

Dan*_*ska 0 c# foreach

如果我在错误的社区发帖,我很抱歉,我在这里很新.

我有多个方法使用相同的foreach循环,只更改我调用的内部方法:

    public void CalculationMethod1()
    {
        foreach (Order order in ordersList)
        {
            foreach (Detail obj_detail in order.Details)
            {
                CalculateDiscount(obj_detail);
            }
        }
    }

    public void CalculationMethod2()
    {
        foreach (Order order in ordersList)
        {
            foreach (Detail obj_detail in order.Details)
            {
                CalculateTax(obj_detail);
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

每个内部方法都有不同的逻辑,数据库搜索,数学计算(这里不重要).

我想调用上面的方法而不是每次都重复foreach循环,所以我将通过以下解决方案:

    public void CalculateMethod_3()
    {
        foreach (Order obj_order in ordersList)
        {
            foreach (Detail obj_detail in order.Details)
            {
                CalculateDiscount(obj_detail);
                CalculateTax(obj_detail);
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

但我陷入了规则问题:

 class Program
 {
    static void Main(string[] args)
    {
        Calculation c = new Calculation();
        c.CalculateMethod_3();
        c.AnotherMethod_4(); //It doesn't use objDetail
        c.AnotherMethod_5(); //It doesn't use objDetail
        c.CalculateMethod_6(); //Method 6 needs objDetail but respecting the order of the methods, so It must be after AnotherMethod_4 and AnotherMethod_5
    }
 }
Run Code Online (Sandbox Code Playgroud)

如何创建一个方法来实现我的目标(我不想重复代码)尊重上面的规则?

Dar*_*opp 8

您始终可以将委托传递给该方法,然后您可以基本上执行任何操作.

public void ApplyToDetails(Action<Detail> callback)
{
    foreach (Order order in ordersList)
    {
        foreach (Detail obj_detail in order.Details)
        {
            callback(obj_detail);
        }
    }       
}
Run Code Online (Sandbox Code Playgroud)

然后使用你做这样的事情

ApplyToDetails(detail => CalculateTax(detail));
ApplyToDetails(detail =>
{
    CalculateDiscount(detail);
    CalculateTax(detail);
});
Run Code Online (Sandbox Code Playgroud)