【发布时间】: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
-
很好,我现在放弃。如果您要向我们提供代码和详细信息,我无能为力。