2

我只是想吐出一个字符串,它将列表的值聚合到一个新行分隔的字符串中。

<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) 的扩展。另外,我想要实现的目标是可能的吗?

4

1 回答 1

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
于 2013-07-08T17:48:21.917 回答