2016-07-08 2 views
-2

Есть ли более сжатый способ для повторного использования кода, например ниже, без цикла ?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

Почему бы не просто вернуть ienumerable (без урона) в GetStreams? – KristoferA

+1

Возможный дубликат [Вложенный доход доходности с IEnumerable] (http://stackoverflow.com/questions/1270024/nested-yield-return-with-ienumerable) – Guvante

+0

@KristoferA не компилируется. – CoderBrien

ответ

1

Вы должны перечислить через вашу коллекцию, чтобы использовать выход возвращение на него. Вы можете изменить свой код к следующему, если вы не хотите, чтобы перебирать коллекцию внутри метода:

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

И тогда вы будете перебирать коллекции находящиеся вашего метода.