2011-07-11 47 views
3

如果我想返回輸入集合,在迭代器塊中使用return語句而不是foreach的最聰明方法是什麼?如果有一個收益,如何返回IEnumerable <T>集合

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

我知道這只是一個示例代碼,但你真的不應該使用'class'作爲變量的名稱:) – grapkulec

回答

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 
} 
0

在這種情況下,我可能會做:

public IEnumerable<T> Filter(IEnumerable<T> collection) 
{ 
    if (someCondition) 
    { 
     return collection 
    } 
    return new [] {new T()}; 
} 

在更復雜的情況下,一些收藏品ns可選包含在返回值中,我使用Union

相關問題