如果我想返回输入集合,在迭代器块中使用return语句而不是foreach的最明智的方法是什么?
public IEnumerable<T> Filter(IEnumerable<T> collection)
{
if (someCondition)
{
// return collection; - cannot be used because of "yield" bellow
foreach (T obj in collection)
{
yield return obj;
}
yield break;
}
yield return new T();
}
答案 0 :(得分:3)
我担心你在迭代器块中可以做的一切。 F#中没有yield!
的等价物,或yield foreach
的概念。这很不幸,但就是这样:(
当然,您可以首先避免使用迭代器块:
public IEnumerable<Class> Filter(IEnumerable<Class> collection)
{
return someCondition ? collection : Enumerable.Repeat(new Class(2), 1);
}
或者如果你有更复杂的逻辑:
public IEnumerable<Class> Filter(IEnumerable<Class> collection)
{
return someCondition ? collection : FilterImpl(collection);
}
private IEnumerable<Class> FilterImpl(IEnumerable<Class> collection)
{
yield return new Class(2);
yield return new Class(1);
// etc
}
答案 1 :(得分:0)
在这种情况下,我可能会这样做:
public IEnumerable<T> Filter(IEnumerable<T> collection)
{
if (someCondition)
{
return collection
}
return new [] {new T()};
}
在更复杂的情况下,某些集合可选地包含在返回值中,我使用Union
。