2010-09-16 5 views
2

Мне не нравится широкий код, особенно когда он заставляет меня прокручивать. Поэтому, написав это:Сокращение этого оператора IF

If _item.SubItems(pd.perioddate).Text = "N/A" Or _item.SubItems(pd.perioddate).Text = String.Empty Then 
      dtpDeadlineforAP.Checked = False 
End If 

Есть ли достойный способ похудеть, сделать его более элегантным?

ответ

5

Извлечь _item.SubItems(pd.perioddate).Text в локальную переменную, например.

String text = _item.SubItems(pd.perioddate).Text 

If text = "N/A" Or text = String.Empty Then 
      dtpDeadlineforAP.Checked = False 
End If 

В качестве альтернативы, вы можете извлечь всю проверку в отдельный метод:

If isNotFilled(_item.SubItems(pd.perioddate)) Then 
      dtpDeadlineforAP.Checked = False 
End If 

Это позволит сделать код более читаемым и позволяет повторно использовать логику проверки.

+0

Я бы переименовать переменную текста означать что-то, тусклый periodDate = _item.SubItems (pd.perioddate) .Text – Iain

+0

Мы должны также рассмотреть Select Case, а не вводить локальную переменную? 'Select Case _item.SubItems (pd.perioddate) .Text Case« N/A »,« dtpDeadlineforAP.Checked = False End Select' – MarkJ

+0

@Iain, согласился, я просто не мог найти хорошее имя - рассматривал 'findSomeMeaningfulNameForThis' на минуту :-) –

1
string obj = _item.SubItems(pd.perioddate).Text; 

If obj = "N/A" Or obj = String.Empty Then 
      dtpDeadlineforAP.Checked = False 
End If 

ТАКЖЕ

включить слово Деформация в визуальной студии, чтобы остановить прокручивая.

перейти к

Tools-> Options-> Текст editor-> Все Языки-> Слово Деформация

не забывайте включить 'Показать все настройки'

+0

Вопрос OP находится в Visual Basic - первая строка вашего ответа находится на C#. – Jazza

+0

@Jazza: Я думаю, что пользователи VB могут (и привыкли) игнорировать ';' –

+1

@Jazza, @Henk Да, и мы также можем мысленно изменить 'string obj' на' Dim obj As String' :) – MarkJ

0
Dim date as String = _item.SubItems(pd.perioddate).Text 

If date = "N/A" Or date = String.Empty Then 
      dtpDeadlineforAP.Checked = False 
End If 
1
With _item.SubItems(pd.perioddate) 
    If .Text = "N/A" Or .Text = String.Empty Then 
     dtpDeadlineforAP.Checked = False 
    End If 
End With 

Cue аргумент относительно достоинств/зол WITH :)

1

Если есть несколько полей, которые могут содержать N/A, я бы uggest следующий подход:

Dim invalidValues As String() = {"N/A", String.Empty} 

If invalidValues.Contains(_item.SubItems(pd.perioddate).Text) Then 
    dtpDeadlineforAP.Checked = False 
End If 

Или, если это только о прокрутки, вы можете использовать VB символ продолжения строки _:

If _item.SubItems(pd.perioddate).Text = "N/A" _ 
Or _item.SubItems(pd.perioddate).Text = String.Empty Then 
    dtpDeadlineforAP.Checked = False 
End If 

КСТАТИ: Вот, я предлагаю OrElse вместо Or.

0

Как и другие, вы можете использовать локальную переменную. Вы также можете укоротить линию, используя символ line continuation_.

String period = _item.SubItems(pd.perioddate); 

If period = "N/A" Or _ 
    period = String.Empty Then 
     dtpDeadlineforAP.Checked = False 
End If 
0

Я suppgest в Helper класса или метод расширения:

If StringIsNullOrEmptyOrNA(stringval) Then 
    ... 
End If 


If stringval.IsNullOrEmptyOrNa() Then 
    .... 
End If 


Public Function StringIsNullOrEmptyOrNA(ByVal input as String) as Boolean 
    return String.IsNullOrEmpty(input) OrElse input.Equals("N/A") 
End Function 


<System.Runtime.CompilerServices.Extension()> 
Public Function IsNullOrEmptyOrNa(ByVal input As String) 
    return String.IsNullOrEmpty(input) OrElse input.Equals("N/A") 
End Sub 
+0

bear в виду, что методы расширения были введены с VB.Net версии 9.0 (VS 2008). OP не упоминает, какую версию VB.Net/VS он использует. – Jazza

+0

Вот почему я добавил примеры для обоих способов: –

1

Мы должны, по крайней мере, упомянуть Select Case

Select Case _item.SubItems(pd.perioddate).Text  
    Case "N/A", "" 
    dtpDeadlineforAP.Checked = False 
End Select 

рассмотреть также извлекая вспомогательную функцию

Function IsNotApplicable(ByVal s As String) As Boolean 
    Return (s = "N/A") Or (s = "") 
End Function 
0

I получил это до 3 строк и 63 столбца. Я заменил традиционный If construct новее If operator. Код также будет обрабатывать случай Text, являющийся нулевой ссылкой, и будет замыкаться на короткое замыкание с помощью оператора OrElse.Если вы хотите объявить пару методов расширения, вы можете уничтожить это до одной короткой строки, но это противоречит духу моего ответа.

Dim tx = _item.SubItems(pd.perioddate).Text 
Dim dtp = dtpDeadlineforAP 
dtp.Checked = If(tx = "N/A" OrElse tx = "", False, dtp.Checked) 
+0

Думаю, мы все еще можем улучшить. VB.Net обрабатывает нулевую ссылочную строку равным «", поэтому вся первая строка может быть удалена. – MarkJ

+0

@MarkJ: Я не знал об этом ... до сих пор. Спасибо что подметил это! –

Смежные вопросы