2016-07-08 92 views
-2

有没有一个更简洁的方式来实现代码重用,如下面没有foreach循环?C#嵌套良率 - 实现代码重用的最简洁方法?

IEnumerable<Stream> GetStreams() { 
    // nope 
    // yield return GetStreamsHelper(); 

    // nope 
    // return GetStreamsHelper(); 

    // yup 
    foreach (var x in GetStreamsHelper()) { 
     yield return x; 
    } 
} 

IEnumerable<Stream> GetStreamsHelper() { 
    using (var stream = OpenStream()) { 
     yield return stream; 
    } 
} 

这里是我尝试才达到一个更完整的例子:

class MoreCompleteExample { 
     IEnumerable<Stream> GetStreams() { 
      string[] files = new[] { "f1", "f2" }; 
      foreach (var f in files) { 
       // HERE I WANT TO USE A HELPER METHOD 
       // NOTHING SEEMS TO WORK EXCEPT A foreach 
       // PERHAPS THERE IS A LINQ-y WAY TO WRITE THE foreach? 
       //return GetStreamsHelper(f);      
       //yield return GetStreamsHelper(f);      
       foreach (var x in GetStreamsHelper(f)) { 
        yield return x; 
       } 

      } 
     } 

     IEnumerable<Stream> GetStreamsHelper(string filename) { 
      using (var stream = new FileStream(filename, FileMode.Open)) { 
       Diddle(stream); 
       yield return stream; 
       Caress(stream); 
      } 
     } 
     void Diddle(Stream stream) { /* show the stream some love */ } 
     void Caress(Stream stream) { /* that was nice but i gotsa go */ } 

    } 
+0

为什么不直接在GetStreams中返回ienumerable(no yield)? – KristoferA

+1

[IEnumerable嵌套的收益返回]的可能重复(http://stackoverflow.com/questions/1270024/nested-yield-return-with-ienumerable) – Guvante

+0

@KristoferA不能编译。 – CoderBrien

回答

1

你必须通过你的收藏枚举使用就可以了产量的回报。您可以更改您的代码到下一个,如果你不想通过收集来遍历你的方法里面:

IEnumerable<Stream> GetStreams() { 
    return GetStreamsHelper(); 
} 

,然后你会通过收集迭代ouside的方法。