如何在C#的计算中将List <double>的单个元素类型转换为类型'double'

时间:2015-12-04 07:24:26

标签: c#

假设我有一个初始化列表:List<double> o

我想执行以下操作:

 int offset = 10;

 for (int i = 0; i < o.Count; ++i){
     o[i] = ApplyRamp(o[i]-offset)
 }

其中ApplyRamp定义为:

 public static void ApplyRamp(ref double x)
 {
     if (x < 0) x = 0;
 }

但代码无法编译。为什么List<double>的单个元素(即o[i])未被视为类型double

3 个答案:

答案 0 :(得分:4)

这里有四个问题:

  • 您必须在参数上使用ref以及参数
  • 表达式o[i] - offset被归类为而不是变量,因此您无法通过引用传递
  • 即使表达式o[i]也会被归类为值,因为它是调用索引器的结果。如果odouble[](即数组而不是列表),那么o[i]将被归类为变量。
  • 您尝试使用void方法的结果作为赋值运算符的右侧。 void方法没有结果。

您可以使用:

double temp = o[i] - offset;
ApplyRamp(ref temp);
// Do something with temp?

但事后不清楚你对temp做了些什么。您是要修改o吗?如果是这样,offset会在哪里进来?那么为什么你会在这种情况下分配给o[i]

最后,我强烈建议您考虑让ApplyRamp只使用常规的按值参数,然后返回结果。这将使其在大多数情况下更容易使用。我很少在ref方法中充分利用void参数。

类似于:

public static double ApplyRamp(double x)
{
    return x < 0 ? 0 : x;
}

或者只使用Math.Max

public static double ApplyRamp(double x)
{
    return Math.Max(x, 0);
}

答案 1 :(得分:2)

您无法将void分配给任何变量,我认为您应该更改方法的签名:

 public static double ApplyRamp(double x)
 {
     if (x < 0) return 0;
     return x;
 }

现在,您的方法将返回double并将此值分配给o[i]元素。

void type description

  

当用作方法的返回类型时,void指定该方法不返回值。

显然你想在这里返回一个值。因为(正如我想的那样),您希望将x调整为非负数。所以我认为更改代码以返回double是最好的方法。

答案 2 :(得分:0)

如果您只是希望获得具有相同值的列表,但对于小于offset的值减少offset或等于0,则可以使用LINQ Select
它会通过将计算函数应用于List<double>数组中的每个项目来创建新的o,然后将此List分配回o

o = o.Select(x => x - offset < 0 ? 0 : x - offset).ToList();

o = o.Select(x => Math.Max(x - offset, 0)).ToList();