If ListView1.CheckBoxes = True Then
'using check boxes
For Each lvi As ListViewItem In ListView1.CheckedItems
'whole bunch of code
Next
Else
'not using check boxes
For Each lvi As ListViewItem In ListView1.SelectedItems
'the exact same whole bunch of code
Next
End If
如何在两个不同的集合集之间进行选择而无需复制我的代码?在我的程序中,我使用CheckedItems执行相同的操作,如果我的用户使用Checkbox,我会使用Selected项目。如何在不丢失对这些项的引用的情况下创建集合变量,以便我仍然可以向它们写入属性?
答案 0 :(得分:1)
使用“提取方法”重构。这是一个简单的例子,假设两个代码块已经很简单了:
If ListView1.CheckBoxes = True Then
'using check boxes
For Each lvi As ListViewItem In ListView1.CheckedItems
MethodCall(lvi)
Next
Else
'not using check boxes
For Each lvi As ListViewItem In ListView1.SelectedItems
MethodCall(lvi)
Next
End If
将“整串代码”转换为接受lvi
作为参数的方法。可能需要其他参数,但请确保lvi
是其中之一。
Private Sub ExtractedMethod1(lvi As ListViewItem)
MethodCall(lvi)
End Sub
将“完全相同的整串代码”转换为另一种以lvi
为参数的方法。同样,可能需要额外的参数。
Private Sub ExtractedMethod2(lvi As ListViewItem)
MethodCall(lvi)
End Sub
调用代码现在看起来像这样:
If ListView1.CheckBoxes = True Then
'using check boxes
For Each lvi As ListViewItem In ListView1.CheckedItems
ExtractedMethod1(lvi)
Next
Else
'not using check boxes
For Each lvi As ListViewItem In ListView1.SelectedItems
ExtractedMethod2(lvi)
Next
End If
如果您对两个代码块几乎完全相同是正确的,那么您将能够进行一系列小改动以使它们实际相同。这可能涉及重命名参数,更改参数顺序,添加参数等等。一旦它们相同,将第二种方法的引用更改为对第一种方法的引用,然后删除第二种方法。
< / LI> 醇>现在,您将拥有一个适用于If
语句的两个分支的方法。
If ListView1.CheckBoxes = True Then
'using check boxes
For Each lvi As ListViewItem In ListView1.CheckedItems
ExtractedMethod1(lvi)
Next
Else
'not using check boxes
For Each lvi As ListViewItem In ListView1.SelectedItems
ExtractedMethod1(lvi)
Next
End If
像ReSharper这样的工具在这类事情上非常有用。
答案 1 :(得分:0)
您只需要将相似的代码放在函数中
If ListView1.CheckBoxes = True Then
'using check boxes
For Each lvi As ListViewItem In ListView1.CheckedItems
SimilarCode(lvi)
Next
Else
'not using check boxes
For Each lvi As ListViewItem In ListView1.SelectedItems
SimilarCode(lvi)
Next
End If
Sub SimilarCode(ByVal lvi As ListViewItem)
'whole bunch of code
End Sub