2015-07-08 4 views
-2

У меня есть этот код ниже:Как оптимизировать мой, если еще код C#

TryUpdateModel(model); 
      if (ModelState.IsValid && model.FullNameIsChecked == true && model.LookingFor == null) 
      { 
       model.ContactList = contactRepository.GetAll(filter: x => x.UserId == user.Id); 
       model.ContactList.Sort((x, y) => string.Compare(x.FullName, y.FullName)); 
      } 
      else if (ModelState.IsValid && model.FullNameIsChecked == false && model.LookingFor == null) 
      { 
       model.ContactList = contactRepository.GetAll(filter: x => x.UserId == user.Id); 
       model.ContactList.Sort((x, y) => string.Compare(x.Email, y.Email)); 
      } 
      else if (ModelState.IsValid && model.LookingFor != null && model.FullNameIsChecked == true) 
      { 
       model.ContactList = contactRepository.GetAll(filter: x => x.UserId == user.Id); 
       model.ContactList = contactRepository.GetAll(filter: x => x.FullName.Contains(model.LookingFor)); 
       model.ContactList.OrderBy(f => f.FullName); 
      } 
      else if (ModelState.IsValid && model.LookingFor != null && model.FullNameIsChecked == false) 
      { 
       model.ContactList = contactRepository.GetAll(filter: x => x.UserId == user.Id); 
       model.ContactList = contactRepository.GetAll(filter: x => x.Email.Contains(model.LookingFor)); 
       model.ContactList.OrderBy(e => e.Email); 
      } 
      else 
      { 
       model.ContactList = contactRepository.GetAll(filter: x => x.UserId == user.Id); 
      } 

Я использую .NET MVC 5 с двигателем Razor, и с кодом выше я делать операции сортировки. Могу ли я оптимизировать свой Если еще часть кода? Единственное, что у меня на уме, это использовать операционный оператор , но он будет выглядеть почти так же. Заранее спасибо

ответ

1
  • я не могу видеть на ModelState
  • Нет необходимости любое использование в вашем текущем состоянии кода для сравнения BOOL, если условие, т.е.

    if(true) 
    

    такой же, как

    if(bool variable=true) 
    
  • использовать String.IsNullOrEmpty проверить null

    TryUpdateModel(model); 
    
        model.ContactList = contactRepository.GetAll(filter: x => x.UserId == user.Id); 
    
         if( String.IsNullOrEmpty(model.LookingFor)) 
         { 
          if(model.FullNameIsChecked) 
          { 
           model.ContactList.Sort((x, y) => string.Compare(x.FullName, y.FullName)); 
          } 
          else 
          { 
           model.ContactList.Sort((x, y) => string.Compare(x.Email, y.Email)); 
          } 
         } 
         else 
         { 
          if(model.FullNameIsChecked) 
          { 
           model.ContactList = contactRepository.GetAll(filter: x => x.FullName.Contains(model.LookingFor)); 
           model.ContactList.OrderBy(f => f.FullName); 
          } 
          else 
          { 
           model.ContactList = contactRepository.GetAll(filter: x => x.UserId == user.Id); 
           model.ContactList = contactRepository.GetAll(filter: x => x.Email.Contains(model.LookingFor)); 
          } 
         } 
    
+1

Это то, что я ищу. Максимум один оператор if внутри оператора If. Отличный ответ. Спасибо ! –

+0

@StoyanPetkov, но он недвусмысленно называет 'GetAll' дважды, что не может быть хорошо. – Jodrell

+0

@Jodrell Да, только что заметил, я не заходил в его бизнес-логику, но определенно его нужно было посмотреть –

2

Все ваши случаи вписываться в этом:

//Place this here since it's non conditional 
model.ContactList = contactRepository.GetAll(filter: x => x.UserId == user.Id); 


if(ModelState.IsValid) 
{ 
    if(model.LookingFor == null) 
    { 
     if(model.FullNameIsChecked){ 
      //... 
     }else 
     { 
      //... 
     } 
    }else 
    { 
     if(model.FullNameIsChecked){ 
      //... 
     }else 
     { 
      //... 
     } 
    } 
} 
else 
{ 
    //... Actually you don't need this case... 
} 
+1

Вы не указали, что некоторый код является условным. – Jodrell

+0

Спасибо за помощь. Проблема в том, что мой наставник говорит, что это плохая практика использовать более одного раза. Если оператор внутри оператора if ... Другими словами, он сказал мне, что не делайте так: If() {if() {if() {и т. Д. .}}} –

+0

@StoyanPetkov Но расширение вложенных условностей еще хуже. –

0
TryUpdateModel(model); 
if(ModelState.IsValid) 
{ 
    model.ContactList = contactRepository.GetAll(filter: x => x.UserId == user.Id); 
    if(model.LookingFor == null) 
    { 
     if(model.FullNameIsChecked) 
     { 
      model.ContactList.Sort((x, y) => string.Compare(x.FullName, y.FullName)); 
     } 
     else 
     { 
      model.ContactList.Sort((x, y) => string.Compare(x.Email, y.Email)); 
     } 
    } 
    else 
    { 
     if(model.FullNameIsChecked) 
     { 
      model.ContactList = contactRepository.GetAll(filter: x => x.FullName.Contains(model.LookingFor)); 
      model.ContactList.OrderBy(f => f.FullName); 
     } 
     else 
     { 
      model.ContactList = contactRepository.GetAll(filter: x => x.Email.Contains(model.LookingFor)); 
      model.ContactList.OrderBy(e => e.Email); 
     } 
    } 
} 
+0

Вы не показываете окончательное другое – Jodrell

+0

Это не нужно, так как состояние модели недействительно. –

+0

Спасибо за помощь. Проблема в том, что мой наставник говорит, что это плохая практика использовать более одного раза. Если оператор внутри оператора if ... Другими словами, он сказал мне, что не делайте так: If() {if() {if() {и т. Д. .}}} –

0

ERM, таким образом, каждое условие проверяется только один раз.

if (ModelState.IsValid) 
{ 
    if (string.IsEmptyOrWhitespace(model.LookingFor)) 
    { 
     model.ContactList = contactRepository.GetAll(filter: x => x.UserId == user.Id); 
    } 
    else 
    { 
     model.ContactList = contactRepository.GetAll(
       filter: x => x.FullName.Contains(model.LookingFor)); 
    } 

    if(model.FullNameIsChecked) 
    { 
     model.ContactList.OrderBy(f => f.FullName); 
    } 
    else 
    { 
     model.ContactList.OrderBy(e => e.Email); 
    } 
} 
else 
{ 
    model.ContactList = contactRepository.GetAll(filter: x => x.UserId == user.Id); 
} 
+0

Спасибо за помощь. Проблема в том, что мой наставник говорит, что это плохая практика использовать более одного раза. Если оператор внутри оператора if ... Другими словами, он сказал мне, что не делайте так: If() {if() {if() {и т. Д. .}}} –

+0

@ СтоянПетков, ну, может быть, ваш наставник должен прочитать ответы здесь? В реальном мире нет жесткого правила. Я бы предположил, что многие «чужие» с сложными условиями - это худшая практика. Его больше кода и труднее читать. – Jodrell

+0

Хорошо, но в моем положении я не могу так говорить с ним ... но я понимаю, что у вас есть точка. –

1

Когда model.LookingFor является ненулевым, вы звоните contactRepository.GetAll() дважды. Первый звонок, до contactRepository.GetAll(filter: x => x.UserId == user.Id), лишний, правда?

Иногда вы звоните в .Sort(), а иногда и вы звоните .OrderBy(). Почему непоследовательность?

Вы использовали x, f и e как фиктивные переменные. Я рекомендую использовать некоторую фиктивную переменную последовательно - возможно, c для «контакта».

В любом случае, этот код хочет сделать какой-то GetAll(), возможно, после чего будет сортироваться. Итак, давайте напишем один звонок до GetAll() и один звонок до OrderBy().

TryUpdateModel(model); 
model.ContactList = contactRepository.GetAll(filter: 
    !ModelState.IsValid ?  (c => c.UserId == user.Id) : 
    model.LookingFor == null ? (c => c.UserId == user.Id) : 
    model.FullNameIsChecked ? (c => c.FullName.Contains(model.LookingFor)) : 
           (c => c.Email.Contains(model.LookingFor)) 
); 
if (ModelState.IsValid) 
{ 
    model.ContactList.OrderBy(model.FullNameIsChecked ? 
     (c => c.FullName) : (c => c.Email) 
    ); 
} 
+0

contactRepository.GetAll (фильтр: x => x.UserId == user.Id), лишний, правда? Нет, это необходимо. У меня есть Пользователь, который содержит список контактов. Поэтому в первый раз, когда я вызываю contact.GetAll(), я вызываю его, потому что мне нужно получить контакты для текущего пользователя. И если пользователь хочет отсортировать свои контакты Asc. я вызываю .GetAll() второй раз, поэтому они будут отображаться отсортированными. Мне очень нравится ваше улучшение. Я ценю это. Спасибо чувак. –

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