2

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

このメソッドは、デバッグ中にリストの内容全体を表示するのに役立ちますが?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

私の質問は、なぜそれが 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 に答える