C# Action<T>,将函数作为参数传递

3

我希望将一个条件作为操作传递给另一个方法。在“ComputerPriceGenerator”中的第一行可以工作,但如何使数组工作(第二行)?.. 有什么想法吗?

我正在寻求建议...,CalculateAllPrice尚未设计。

public void ComputerPriceGenerator()
{
    //Below line Works
    PriceMachine.CalculatePrice(cart.Computers[0],() => ComputerConverter(cart.Computers[0]));           
    //How to make this work, i don't want to loop it???
    PriceMachine.CalculateAllPrice(cart.Computers,() => ComputerConverter(??));
}

public void ComputerConverter(Computer comp)
{
    if (comp.Memory <= 2)
        comp.Discount = 10;
}

2
你的代码本来是使用LINQ的绝佳候选,但它充满了副作用。我建议进行重构。 - Jeff Mercado
1
不显示CalculatePrice和CalculateAllPrice的签名,很难知道如何帮助您。 - Jon Skeet
2
@Jon Skeet:看起来他似乎在寻求CalculateAllPrice的签名应该是什么的建议。不过我可能错了。 - Justin Morgan
@JonSkeet,@Justin Morgan... 我正在寻求建议... CalculateAllPrice尚未设计,但对于CalculatePrice,它需要类型Action CalculatePrice(Computer comp,Action myAction)。 - kayak
3个回答

10

我认为你的CalculatePrice方法不应该只接受Action参数 - 在我看来,两个方法都应该接受Action<Computer>参数。因此,我会将这两个方法更改为:

public static void CalculatePrice(Computer computer, Action<Computer> action)
public static void CalcuateAllPrices(IEnumerable<Computer> computers,
                                     Action<Computer> action)

然后像这样调用它们:

PriceMachine.CalculatePrice(cart.Computers[0], ComputerConverter);
PriceMachine.CalculateAllPrice(cart.Computers, ComputerConverter);

Jon,我有一个未解决的问题(这个问题与此无关,我将删除它)...如果你有任何建议,请告诉我“http://stackoverflow.com/questions/4444972/iterate-a-linq-expression-and-convert-it-into-db-parameter”。 - kayak
1
@kayak:那里的答案基本上已经回答了我想表达的。你几乎肯定不想走这条路。 - Jon Skeet
Jon,你的第二个方法是单子的一个例子吗?我一直在努力理解它们到底是什么以及如何使用它们。 - Justin Morgan
@Justin:不,我认为这并不是一个单子(monad) - 首先需要更多的涉及到方法签名。 - Jon Skeet

1

由于您想将该方法应用于数组的所有元素,因此您无法避免对其进行迭代。

您可以将PriceMachine.CalculateAllPrice定义为以下内容:

public void CalculateAllPrice(IEnumerable<Computer> data, Action<Computer> action)
{
  foreach(Computer c in data)
    action(c);
}

我同意,但是如何从主方法传递Action呢? "PriceMachine.CalculateAllPrice(cart.Computers,()=> ComputerConverter(??));" - kayak

1
PriceMachine.CalculateAllPrice(cart.Computers, (Computer x) => ComputerConverter(x));

然后让CalculateAllPrice迭代cart.Computers并将每个计算机传递给匿名函数。


1
看起来有点过度了。(cart.Computers, (Computer x) => ComputerConverter(x))(cart.Computers, ComputerConverter) 是一样的。 - Juliet
@Juliet:当然,我只是按照他发布的lambda风格来保持一致。 - Justin Morgan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接