I hope there is a more convenient way to write this method and overload with less code duplication. I want to return a sequence of deltas between items in a list. this method: -
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; } }
works great.
Then I thought of an overload that would allow an absolute delta, but would call the original method if an absolute is not required: -
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); } }
but this does not compile due to an error
"Cannot return value from iterator. Use return return to return value or exit interrupt to complete iteration."
I looked through this post , and it looks like I can’t do anything but repeat the code from the original method:
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; } } }
Can anyone suggest a better way to do this?
yield c # extension-methods ienumerable refactoring
Dave00galloway
source share