当调用使用yield返回的方法时,错误“迭代器不能包含return语句” [英] Error 'Iterator cannot contain return statement ' when calling a method that returns using a yield
问题描述
我希望有写这个方法与功放一个更好的方式;重载用更少的代码重复。我想在列表中返回三角洲项目之间的序列。此方法: -
公共静态的IEnumerable<&小数GT; CalculateDeltas(这IEnumerable的<&小数GT序列)
{
十进制上一页=默认值(十进制);
的foreach(按顺序VAR项)
{
无功电流=项目;
十进制差异=当前 - 上一个;
上一个=项目;
收益率的回报差异;
}
}
作品就好。
然后我想到了一个重载允许一个绝对的增量,但如果绝对没有要求就调用原始的方法: -
公共静态的IEnumerable<&小数GT; CalculateDeltas(这IEnumerable的<&小数GT序列,布尔绝对)
{
如果(绝对值)
{
十进制上一页=默认值(十进制);
的foreach(按顺序VAR项)
{
无功电流=项目;
十进制差异= Math.Abs(当前 - 上一个);
上一个=项目;
收益率的回报差异;
}
}
,否则
{
返回CalculateDeltas(序列);
}
}
但是,这并不编译,因为错误的p>
不能返回从迭代器的值。使用收益回报
语句返回一个值,或产量突破结束迭代。
块引用>
我有一个看的这个帖子并好像我不能做任何其他比从重复码原始的方法: -
公共静态的IEnumerable<&小数GT; CalculateDeltas(这IEnumerable的<&小数GT序列,布尔绝对)
{
如果(绝对值)
{
十进制上一页=默认值(十进制);
的foreach(按顺序VAR项)
{
无功电流=项目;
十进制差异= Math.Abs(当前 - 上一个);
上一个=项目;
收益率的回报差异;
}
}
,否则
{
十进制上一页=默认值(十进制);
的foreach(按顺序VAR项)
{
无功电流=项目;
十进制差异=当前 - 上一个;
上一个=项目;
收益率的回报差异;
}
}
}
任何人都可以提出一个更好的办法这样做的?
解决方案一个单一的方法不能同时
收益回报率
和收益
。你必须选择一个或另一个。
您既可以做一个
的foreach
到收益率返回
清单:别的
{
的foreach(在VAR项目CalculateDeltas(序列))
收益回报的项目;
}
或者你的代码分成两种方法:
如果(绝对值)
返回CalculateAbsoluteDeltas(序列);
,否则
返回CalculateDeltas(序列);
I'm hoping there's a nicer way to write this method & overloads 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 just fine.
I then thought about an overload which would allow an absolute delta, but would call the original method if absolute wasn't 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 doesn't compile because of Error
"Cannot return a value from an iterator. Use the yield return statement to return a value, or yield break to end the iteration."
I've had a look at this post and it seems like I won't be able to do anything other than repeating 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 of doing this?
解决方案A single method cannot both
yield return
andreturn
. You must choose one or the other.You can either do a
foreach
toyield return
the list:else { foreach (var item in CalculateDeltas(sequence)) yield return item; }
Or separate your code into two methods:
if (absolute) return CalculateAbsoluteDeltas(sequence); else return CalculateDeltas(sequence);
这篇关于当调用使用yield返回的方法时,错误“迭代器不能包含return语句”的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!