【问题标题】:C# Nested yield -- most concise way to achieve code reuse?C#嵌套yield——实现代码重用最简洁的方法?
【发布时间】:2016-11-10 11:11:31
【问题描述】:

有没有更简洁的方法来实现代码重用,例如下面没有foreach 循环?

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 */ }

    }

【问题讨论】:

  • 为什么不在 GetStreams 中返回可枚举的(无收益)?
  • 什么假设?要么我是对的,要么你没有向我们展示你的实际代码。是哪个?
  • 只是为了告诉你它编译...ideone.com/0NzfcP
  • 很好,我现在放弃。如果您要向我们提供代码和详细信息,我无能为力。

标签: c# iterator yield


【解决方案1】:

你必须枚举你的集合才能使用它的收益回报。如果您不想在方法中遍历集合,可以将代码更改为下一个:

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

然后您将遍历您的方法之外的集合。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-23
    • 1970-01-01
    • 2011-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-05
    相关资源
    最近更新 更多