我希望有一种更好的方法来编写这个方法和重载,以减少代码复制。 我想返回列表项之间的增量序列。 这是该方法:
public static IEnumerable<decimal> CalculateDeltas(this IEnumerable<decimal> sequence)
{
decimal prev = default(decimal);
foreach (var item in sequence)
{
var current = item;
decimal diff = current - prev;
prev = item;
yield return diff;
}
}
运作得非常好。
然后我考虑了一种重载方式,它可以允许使用绝对值的偏移量,但如果不需要绝对值,则会调用原始方法:
public static IEnumerable<decimal> CalculateDeltas(this IEnumerable<decimal> sequence,bool absolute)
{
if (absolute)
{
decimal prev = default(decimal);
foreach (var item in sequence)
{
var current = item;
decimal diff = Math.Abs(current - prev);
prev = item;
yield return diff;
}
}
else
{
return CalculateDeltas(sequence);
}
}
但是因为错误,这段代码无法编译。
"无法从迭代器返回值。使用yield return语句返回值,或使用yield break结束迭代。"
我查看了这篇帖子,似乎我只能重复原始方法中的代码而无法做其他事情:
public static IEnumerable<decimal> CalculateDeltas(this IEnumerable<decimal> sequence,bool absolute)
{
if (absolute)
{
decimal prev = default(decimal);
foreach (var item in sequence)
{
var current = item;
decimal diff = Math.Abs(current - prev);
prev = item;
yield return diff;
}
}
else
{
decimal prev = default(decimal);
foreach (var item in sequence)
{
var current = item;
decimal diff = current - prev;
prev = item;
yield return diff;
}
}
}
有人能建议更好的做法吗?
yield return
后面放错了东西。用item
试试(我刚刚编辑了我的答案)。 - Tim S.foreach (var item in sequence.CalculateDeltas()) yield return item;
- Dave00Galloway