我只是想吐出一个字符串,该字符串将列表的值聚合为 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/