お世話になります。
拡張性の高いクラスというものを作りたく
ジェネリックを使用しクラスを作成してみました。
このような作り方じゃだめ
こうするべき
これを参考にしたほうがいい
等ありましたらご教授ください
どうかよろしくお願いいたします。
追記1
1、2言のコメントでも頂けましたら幸いです。
今後のプログラミングでいかしていけるよう心に留めます。
lang
1概要 2 リスト内要素 2回以上連続する場合1回とする 3クラス 4 Class ConvertList(Of T) 5コンストラクタ 6 Sub New(ByVal list As List(Of T), ByVal convertType As Type, Optional ByVal itemName As String = Nothing) 7メソッド 8 Function GetList() As List(Of T) 9 10[使用例] 111. 12 Dim list as new List(of DataRow) 13 Dim row as DataRow = nothing 14 Dim column as new DataColumn("F_Tmp",Type.GetType("System.String")) 15 Dim table as DataTable("table1") 16 17 table.Columns.Add(column) 18 19 For i = 0 to 5 20 row = table.NewRow 21 row.Item("F_Tmp") = "aaa" 22 list.Add(row) 23 next 24 25 For i = 0 to 10 26 row = table.NewRow 27 row.Item("F_Tmp") = "bbb" 28 list.Add(row) 29 next 30 31 For i = 0 to 3 32 row = table.NewRow 33 row.Item("F_Tmp") = "ccc" 34 list.Add(row) 35 next 36 37 Dim cls As New ConvertList(Of DataRow)(list, ConvertList(Of DataRow).Type.NotConsecutive, "F_Tmp") 38 39 '列名 F_Tmp を対象とし、連続しているDataRowを1つにする 40 list = cls.GetList() 41 42 'リストの中身はaaa,bbb,ccc1つずつになる 43 442. 45 Dim list As New List(Of String) From {"one", "one", "two", "three", "three", "three"} 46 47 Dim cls As New ConvertList(Of DataRow)(list, ConvertList(Of DataRow).Type.NotConsecutive) 48 49 'ToStringを対象とし、連続しているStringを1つにする 50 list = cls.GetList() 51 52 'リストの中身はone,two,three1つずつになる 53
以下本体
lang
1 2''' <summary> 3''' リストを変換する 4''' </summary> 5''' <remarks></remarks> 6Public Class ConvertList(Of T) 7 8#Region "定義" 9 10 ''' <summary> 11 ''' 変換タイプ 12 ''' </summary> 13 ''' <remarks></remarks> 14 Enum Type 15 '連続しない 16 NotConsecutive 17 End Enum 18 19#End Region 20 21#Region "変数" 22 23'リスト 24Private Property list As List(Of T) 25 26'対象アイテム 27Private Property itemName As String 28 29'変換タイプ 30Private Property convertType As Type 31 32'変換クラス 33Private Property cls As IConvertEnumrable(Of T) 34 35#End Region 36 37#Region "コンストラクタ" 38 39''' <summary> 40''' コンストラクタ 41''' </summary> 42''' <param name="list">変換対象のリスト</param> 43''' <param name="convertType">変換タイプ</param> 44''' <param name="itemName">リスト内各要素 比較対象</param> 45''' <remarks></remarks> 46Public Sub New(ByVal list As List(Of T), ByVal convertType As Type, Optional ByVal itemName As String = Nothing) 47 Me.list = list 48 Me.itemName = itemName 49 Me.convertType = convertType 50 51 '変換タイプの変換クラスをインスタンス化 52 Call SetConvertType() 53End Sub 54 55#End Region 56 57#Region "公開メソッド" 58 59 ''' <summary> 60 ''' 行返す 61 ''' </summary> 62 ''' <returns></returns> 63 ''' <remarks></remarks> 64Public Function GetList() As List(Of T) 65 66 '行取得 67 Return Me.cls.GetEnumerable().ToList() 68 69End Function 70 71#End Region 72 73#Region "内部メソッド" 74 75 ''' <summary> 76 ''' 変換タイプに一致するクラスをインスタンス化 77 ''' </summary> 78 ''' <remarks></remarks> 79 Private Sub SetConvertType() 80 81 Select Case Me.convertType 82 Case Type.NotConsecutive 83 Me.cls = New NotConsecutive(Of T)() 84 Me.cls.SetEnumerable(Me.list, Me.itemName) 85 End Select 86 87 End Sub 88 89#End Region 90 91End Class 92
lang
1''' <summary> 2''' 変換インターフェイス 3''' </summary> 4''' <remarks></remarks> 5Public Interface IConvertEnumrable(Of T) 6 7 'リストを受け取る 8 Sub SetEnumerable(ByVal list As IEnumerable(Of T), ByVal itemName As String) 9 10 'リストを返す 11 Function GetEnumerable() As IEnumerable(Of T) 12 13 '比較対象となるアイテム取得 14 Function GetItem(ByVal i As Integer) As String 15 16End Interface 17 18 19 20''' <summary> 21''' 変換クラス 22''' </summary> 23''' <remarks></remarks> 24Class NotConsecutive(Of T) 25 Implements IConvertEnumrable(Of T) 26 27#Region "変数" 28 29 'リスト 30 Public Property list As List(Of T) 31 '対象アイテム 32 Public Property itemName As String 33 34#End Region 35 36#Region "公開メソッド" 37 38 ''' <summary> 39 ''' リストを受け取る 40 ''' </summary> 41 ''' <param name="list"></param> 42 ''' <param name="itemName"></param> 43 ''' <remarks></remarks> 44 Public Sub SetEnumerable(list As IEnumerable(Of T), ByVal itemName As String) Implements IConvertEnumrable(Of T).SetEnumerable 45 46 Me.list = list 47 Me.itemName = itemName 48 49 End Sub 50 51 ''' <summary> 52 ''' リストを返す 53 ''' </summary> 54 ''' <returns></returns> 55 ''' <remarks></remarks> 56 Public Iterator Function GetEnumerable() As IEnumerable(Of T) Implements IConvertEnumrable(Of T).GetEnumerable 57 58 For i = 0 To Me.list.Count - 1 59 60 If i <> Me.list.Count - 1 Then 61 '最後のインデックス以外 62 While GetItem(i) = GetItem(i + 1) 63 '連続する値は返さない 64 Continue For 65 End While 66 End If 67 68 '連続時は最後の値を返す 69 Yield Me.list(i) 70 Next 71 72 End Function 73 74 ''' <summary> 75 ''' アイテム取得 76 ''' </summary> 77 ''' <param name="i"></param> 78 ''' <returns></returns> 79 ''' <remarks></remarks> 80 Public Function GetItem(ByVal i As Integer) As String Implements IConvertEnumrable(Of T).GetItem 81 Dim item As Object = Me.list(i) 'インデックスの位置のアイテム 82 Dim ret As String = Nothing '戻り値 83 84 If Me.itemName Is Nothing Then 85 'アイテムの指定がなかった場合 86 ret = item.ToString() 87 Else 88 'アイテムの指定があった場合 89 Select Case GetType(T) 90 '- DataRowの場合 91 Case GetType(DataRow) 92 ret = item.item(itemName) 93 94 End Select 95 End If 96 97 '比較対象を返す 98 Return ret 99 End Function 100 101#End Region 102 103End Class 104
追記2
変換クラスである「NotConsecutive」において
連続を省くという処理が分離されておらず
良くないコードと感じましたので修正いたします。
lang
1''' <summary> 2''' 変換クラス 3''' </summary> 4''' <remarks></remarks> 5Class NotConsecutive(Of T) 6 Inherits ConvertEnumrable(Of T) 7 8#Region "公開メソッド" 9 10 ''' <summary> 11 ''' 連続する値は返さない 12 ''' </summary> 13 ''' <param name="i"></param> 14 ''' <returns>T 返却対象 F 返却対象でない</returns> 15 ''' <remarks>引数はリストの各インデックスである</remarks> 16 Protected Overrides Function IsGetEnumrable(ByVal i As Integer) As Boolean 17 18 If i <> Me.list.Count - 1 Then 19 '最後のインデックス以外 20 While GetItem(i) = GetItem(i + 1) 21 '連続する値は返さない 22 Return False 23 End While 24 End If 25 26 Return True 27 28 End Function 29 30#End Region 31 32End Class
あわせてインターフェース、変換クラスのベースを作成します。
(インターフェースにふさわしくないメソッドがあり修正いたしました。)
lang
1''' <summary> 2''' 変換インターフェイス 3''' </summary> 4''' <remarks></remarks> 5Public Interface IConvertEnumrable(Of T) 6 7 'リストを受け取る 8 Sub SetEnumerable(ByVal list As IEnumerable(Of T), ByVal itemName As String) 9 10 'リストを返す 11 Function GetEnumerable() As IEnumerable(Of T) 12 13End Interface 14 15 16''' <summary> 17''' 変換クラス 18''' </summary> 19''' <typeparam name="T"></typeparam> 20''' <remarks></remarks> 21Public MustInherit Class ConvertEnumrable(Of T) 22 Implements IConvertEnumrable(Of T) 23 24#Region "変数" 25 26 'リスト 27 Protected Property list As List(Of T) 28 '対象アイテム 29 Protected Property itemName As String 30 31#End Region 32 33#Region "公開メソッド" 34 35 ''' <summary> 36 ''' リストを受け取る 37 ''' </summary> 38 ''' <param name="list"></param> 39 ''' <param name="itemName"></param> 40 ''' <remarks></remarks> 41 Public Sub SetEnumerable(list As IEnumerable(Of T), ByVal itemName As String) Implements IConvertEnumrable(Of T).SetEnumerable 42 43 Me.list = list 44 Me.itemName = itemName 45 46 End Sub 47 48 ''' <summary> 49 ''' リストを返す 50 ''' </summary> 51 ''' <returns></returns> 52 ''' <remarks></remarks> 53 Public Iterator Function GetEnumerable() As IEnumerable(Of T) Implements IConvertEnumrable(Of T).GetEnumerable 54 55 For i = 0 To Me.list.Count - 1 56 57 '返却対象でない場合スキップ 58 If IsGetEnumrable(i) = False Then Continue For 59 60 '値を返す 61 Yield Me.list(i) 62 Next 63 64 End Function 65 66#End Region 67 68#Region "内部メソッド" 69 70 ''' <summary> 71 ''' 返却対象の値であるか確認 72 ''' </summary> 73 ''' <param name="i"></param> 74 ''' <returns>T 返却対象 F 返却対象でない</returns> 75 ''' <remarks>引数はリストの各インデックスである</</remarks> 76 Protected MustOverride Function IsGetEnumrable(ByVal i As Integer) As Boolean 77 78 79 ''' <summary> 80 ''' アイテム取得 81 ''' </summary> 82 ''' <param name="i"></param> 83 ''' <remarks></remarks> 84 Protected Function GetItem(ByVal i As Integer) As String 85 Dim item As Object = Me.list(i) 'インデックスの位置のアイテム 86 Dim ret As String = Nothing '戻り値 87 88 If Me.itemName Is Nothing Then 89 'アイテムの指定がなかった場合 90 ret = item.ToString() 91 Else 92 'アイテムの指定があった場合 93 Select Case GetType(T) 94 '- DataRowの場合 95 Case GetType(DataRow) 96 ret = item.item(itemName) 97 98 End Select 99 End If 100 101 '比較対象を返す 102 Return ret 103 End Function 104 105#End Region 106 107End Class
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/03/31 08:17
2015/03/31 08:19
2015/03/31 11:03
2015/03/31 14:44