C#行动<;T>;,传递函数作为参数

C#行动<;T>;,传递函数作为参数,c#,C#,我想将一个条件作为操作传递给另一个方法。“ComputerPriceGenerator”中的第一行工作,但如何使阵列工作(第二行)?。。有什么想法吗 我在寻求建议…,CalculatealPrice还没有设计好 public void ComputerPriceGenerator() { //Below line Works PriceMachine.CalculatePrice(cart.Computers[0],() => ComputerConverter(cart.

我想将一个条件作为操作传递给另一个方法。“ComputerPriceGenerator”中的第一行工作,但如何使阵列工作(第二行)?。。有什么想法吗

我在寻求建议…,CalculatealPrice还没有设计好

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;
}
public void ComputerPriceGenerator()
{
//线下工程
PriceMachine.CalculatePrice(购物车计算机[0],()=>ComputerConverter(购物车计算机[0]);
//如何使这项工作,我不想循环它???
PriceMachine.CalculatealPrice(购物车计算机,()=>ComputerConverter(?);
}
公用计算机转换器(计算机公司)
{

如果(comp.Memory希望将该方法应用于数组的所有元素,则无法绕过它进行迭代

您可以这样定义
PriceMachine.calculatealprice

public void CalculateAllPrice(IEnumerable<Computer> data, Action<Computer> action)
{
  foreach(Computer c in data)
    action(c);
}
public void calculatealprice(IEnumerable数据,动作)
{
foreach(数据中的计算机c)
行动(c);
}

然后让
calculatealprice
cart.Computers
中迭代,并将每一个都传递给匿名函数。

你的
CalculatePrice
方法不应该只执行
操作,依我看-这两种方法都应该执行
操作
。因此,我会有这样的方法:

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);

您的代码将是使用LINQ的一个很好的候选者,但是它充满了副作用。我会考虑重构。在不显示CalculatePrice和CalculateAllPrice的签名的情况下,很难知道如何帮助您。@乔恩SkiT:他看起来好像在寻求关于“代码> CalculateAllPrice < /代码>的签名应该是什么的建议。。不过,我可能错了。@JonSkeet,@Justin Morgan…我在寻求建议…,CalculateAllPrice尚未设计,但对于CalculatePrice来说,它采取的类型操作CalculatePrice(Computer comp,Action myAction)似乎有点过火。
(cart.Computers,(Computer x)=>ComputerConverter(x))
(cart.Computers,ComputerConverter)
@Juliet:当然,我只是保持了他发布的lambda风格。我同意,但是如何通过主方法“PriceMachine.calculatealprice(cart.Computers,()=>ComputerConverter(?);”Jon,我有一个未解决的问题(这个问题与这个问题无关,我将删除这个)..,如果您有任何建议,请告诉我“@kayak:那里的答案和我想的差不多。你几乎肯定不想走这条路。Jon,你的第二种方法是单子的例子吗?我一直在想这些方法都是关于什么以及如何使用它们。@Justin:不,在我看来,这不是真正的单子-需要更多的参与,而不仅仅是单一的方法首先是签名。
PriceMachine.CalculatePrice(cart.Computers[0], ComputerConverter);
PriceMachine.CalculateAllPrice(cart.Computers, ComputerConverter);