代码之家  ›  专栏  ›  技术社区  ›  Raúl Roa

C#到VB.净收益率-收益率转换

  •  3
  • Raúl Roa  · 技术社区  · 17 年前

    这段代码在VB.NET中的翻译是什么?

    public static IEnumerable<TSource> Where<TSource>(
    this IEnumerable<TSource> source,
    Func<TSource, Boolean> predicate)
    {
      foreach (TSource element in source)
      {
        if (predicate(element))
        yield return element;
      }
    } 
    
    4 回复  |  直到 17 年前
        1
  •  5
  •   Jon Skeet    17 年前

    这里的问题不是转换扩展方法,而是转换迭代器块(该方法使用 yield return . VB没有任何等价的语言构造-您必须创建自己的 IEnumerable<T> 进行筛选,然后从扩展方法返回类的实例。

    有一点需要注意,否则可能不明显: IEnumerator<T> 工具 IDisposable ,及 foreach 循环在末尾处理迭代器。这可能非常重要,所以如果你 创建您自己的实现(坦率地说,我建议您不要这样做),您需要调用 Dispose 在从返回的迭代器上 source.GetEnumerator() 你自己 处置

        2
  •  5
  •   bbqchickenrobot joe_coolish    12 年前

    这个问题由来已久,但对于从谷歌来到这里的人们来说,有一个好消息——VB.NET的新版本支持c#收益率回报运营商(我相信这是isn VS.NET 2010/2012 w/.NET 4.0)。。。以下是转换后的示例:

    <System.Runtime.CompilerServices.Extension> _
    Public Iterator Function Where(Of TSource)(source As IEnumerable(Of TSource), predicate As Func(Of TSource, [Boolean])) As IEnumerable(Of TSource)
        '' non-lambda version of the method body
        'For Each element As TSource In source
        '    If predicate(element) Then
        '        Yield element
        '    End If 
        'Next
        For Each element As TSource In From item In source Where predicate(item)
            Yield element
        Next
    End Function
    

        3
  •  3
  •   Eduardo Molteni    17 年前

    yield 关键词。为了实施 产量 IEnumerable<T> ... 你可以退房 this article 进行良好的演练。

    <System.Runtime.CompilerServices.Extension> _
    Public Shared Function Where(Of TSource) ( _
                    ByVal source As IEnumerable(Of TSource), _
                    ByVal predicate As Func(Of TSource, [Boolean])) _
           As IEnumerable(Of TSource)
    
        4
  •  1
  •   Marc Gravell    17 年前

    问题是VB不支持迭代器块。你不能仅仅使用现有的资源吗 Enumerable.Where VB中的方法?

    第一 -只返回结果数组/列表,但这不会有C#迭代器块提供的延迟执行。这是一种痛苦;我经常将迭代器块用于长(即本质上无限)序列。

    推荐文章