vb.net - 通用扩展方法,List(Of T)

标签 vb.net generics extension-methods

我只是想吐出一个字符串,该字符串将列表的值聚合为 NewLine 分隔的字符串。

<Extension()>
Public Function ToColumn(Of T)(ByVal source As IEnumerable(Of T)) As String
    ' assuming Aggregate(Of String) will be inefficient, using StringBuilder
    Dim sb As New StringBuilder()
    For Each val As T In source
        sb.Append(val.ToString() & Environment.NewLine)
    Next
    Return sb.ToString()
End Function

此方法将有助于在调试时查看列表的全部内容,而 ?source 仅在立即窗口中吐出前 100 个元素(也许有不同的方法可以做到这一点? )。我只是希望能够将其快速复制到 Excel 等文件中进行分析。

问题是,虽然这个方法可以编译,但在使用中,它不被识别为 List(of T) 的扩展,即

Dim result As Int32()
Debug.Print(result.ToList().ToColumn())
' this line doesn't compile:
' 'toColumn' is not a member of 'System.Collections.Generic.List(Of Integer)'

我想在任何可以装箱到对象中并获得 .ToString() (一切!)的东西上重用这个方法,因此它的通用方面。我见过很多人向通用 T 添加约束,即 Where T : Constraint,但我的约束将是 Object,这就是该方法的本质,它无法编译。

我的问题是为什么它不被识别为 List(Of Integer) 的扩展。另外,我想要实现的目标可能吗?

最佳答案

您是否尝试过在 List(Of T) 上使用扩展方法而不是 IEnumerable(Of T),如下所示:

<Extension()>
Public Function ToColumn(Of T)(ByVal source As List(Of T)) As String
    ' assuming Aggregate(Of String) will be inefficient, using StringBuilder
    Dim sb As New StringBuilder()
    For Each val As T In source
        sb.Append(val.ToString() & Environment.NewLine)
    Next
    Return sb.ToString()
End Function

关于vb.net - 通用扩展方法,List(Of T),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17532679/

相关文章:

c# - Unity 配置和嵌套泛型类型

c# - 通用扩展方法解析失败

linq - 调试 IEnumerable<T>.Join() 的内部结构

asp.net - 在哪里可以找到丢失的 .aspx.vb 文件的副本?

vb.net - 在 .NET 中截断日志文件的开头

c# - 检测多个 Keyup/Keydown 事件并停止在每个 C#/VB.Net 上触发代码

c# - 将 List<T> 定制为 ListCustomMinIndexedForEach<T> 的问题(从不相关的实现中剥离)

vb.net - 有没有办法在 vb.net 循环中使用非线性步长?

c# - 为什么我会收到 "The type parameter must be invariantly valid..."错误?

generics - 如何为泛型类型编写扩展方法,其中一个类型变量必须是字符串?