如何返回 IEnumerable如果有一个收益,则收集

发布于 2024-11-19 12:40:45 字数 390 浏览 3 评论 0原文

如果我想返回输入集合,在迭代器块中使用 return 语句而不是 foreach 的最明智的方法是什么?

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();
}

What is the smartest way to use return statement in iterator block instead of foreach if I want to return input collection?

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();
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

鹤仙姿 2024-11-26 12:40:46

在这种情况下,我可能会这样做:

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

在更复杂的情况下,某些集合可以选择包含在返回值中,我使用Union

In this case, I would probably do:

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

In more complex cases, where some collections are optionally included in the return value, I use Union.

空城之時有危險 2024-11-26 12:40:45

恐怕这就是你在迭代器块中所能做的全部事情。 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
}

I'm afraid that's all you can do within an iterator block. There's no equivalent of yield! in F#, or the idea of a yield foreach. It's unfortunate, but that's the way it is :(

Of course, you could avoid using an iterator block in the first place:

public IEnumerable<Class> Filter(IEnumerable<Class> collection)
{
   return someCondition ? collection : Enumerable.Repeat(new Class(2), 1);
}

Or if you have more complex logic:

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
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文