我只是想吐出一个字符串,它将List的值聚合成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
这个方法在调试时有助于查看List的全部内容,而?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)'
我想在我可以装入Object的任何东西上重用这个方法并获得.ToString()(所有!),因此它的一般方面。我见过很多人为泛型T添加约束,即Where T : Constraint
,但我的约束是Object,这个方法的本质是不可编译的。
我的问题是为什么它不被认为是List(Of Integer)的扩展。另外,我想实现的目标是什么?
答案 0 :(得分:2)
您是否尝试在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