2013-12-22 3 views
0

Предположим, что у меня есть это, если заявление:оценка условий, если заявление

foreach (MyModel m in SomeList) 
{ 
    if (m.pID != SomeValue && (m.xID != 0 && SomeFunction(m.xID) == false) 
    { 
     return false; 
    } 
} 

Я только хочу SomeFunction(m.xID) == false оценить, если m.xID != 0 так что если то не оценить SomeFunction

На данный момент, я иметь этот оператор if, разбитый на 2 утверждения, и я хочу посмотреть, как я могу объединить их в один, сохраняя логику. Это оригинал:

foreach (MyModel m in SomeList) 
{ 
    if (m.xID != 0 && SomeFunction(m.xID) == false) 
    { 
     return false; 
    } 

    if (m.pID != SomeValue) 
    { 
     return false; 
    } 
} 

ответ

5

Если это все ваш цикл делает, то я был бы склонен удалить петлю целиком.

Кроме того, вместо сравнения чего-либо с false, просто используйте оператор !.

if (SomeList.Any(MyModel m=>m.xID != 0 && !SomeFunction(m.xID) || m.pID != SomeValue)) 
    return false; 
+0

Это выражение Linq не будет оцениваться как цикл, который будет перебирать каждый элемент? Мне нравится этот синтаксис Linq BTW. – frenchie

+0

@frenchie: Конечно. Дело в том, что цикл удаляется из * вашего * кода. Преимущество кода стиля LINQ заключается в том, что он заставляет ваш код выражать * * намерение *, а не выражать * механизм *. Если вы объясняете цель своего цикла кому-то, вы сказали бы: «Цель цикла - вернуть false, если в коллекции есть какие-либо элементы, отвечающие этим условиям». Цель кода - не цикл; цикл - это только * механизм *, который достигает цели. Код LINQ читается как ваша цель. –

+0

Хорошо, очень круто! Я закончил удаление цикла! – frenchie

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