2013-11-18 2 views
0

Как суммировать следующую условную инструкцию?Резюме условного оператора

private static Func<T_Users, bool> GetFunc(short no = -1, decimal country = -1) 
{ 
    Func<T_Users, bool> exp; 

    if (no == -1 && countryNo != -1) 
    { 
     exp = t => t.Country == country; 
    } 

    if (no != -1 && countryNo == -1) 
    { 
     exp = t => t.No == no; 
    } 

    if (no != -1 && countryNo != -1) 
    { 
     exp = t => t.No == no && t.Country == countryNo; 
    } 

    if (no == -1 && countryNo == -1) 
    { 
     exp = t => t.No != no && t.Country != countryNo; 
    } 
    return exp; 
} 

Состояние хорошее. Это неправда. Я думаю, что есть правильный путь, но я не знаю. Я не собираюсь это делать.

ответ

1

Команде C# понадобилось некоторое время, чтобы добавить поддержку аргументов по умолчанию. Вероятно, у них был код в этом вопросе. Вы, конечно, не получите предупреждение о цикломатической сложности от:

private static Func<T_Users, bool> GetFunc() { 
    return new Func<T_Users, bool>((t) => t.No == -1 && t.Country == -1); 
} 
private static Func<T_Users, bool> GetFunc(short no) { 
    return new Func<T_Users, bool>((t) => t.No == no && t.Country == -1); 
} 
private static Func<T_Users, bool> GetFunc(decimal country) { 
    return new Func<T_Users, bool>((t) => t.No == -1 && t.Country == country); 
} 
private static Func<T_Users, bool> GetFunc(short no, decimal country) { 
    return new Func<T_Users, bool>((t) => t.No == no && t.Country == country); 
} 
0

Вы можете переместить if -statements в лямбда-функции, например:

Func<T_Users, bool> GetFunc(short no = -1, decimal country = -1) 
{ 
    return t => (no == -1 || t.No == no) 
      && (countryNo == -1 || t.Country == countryNo); 
} 

Однако, я хотел бы использовать обнуляемымshort? и decimal? вместо этого (обратите внимание на вопросительные знаки), поскольку null идеально подходит для представления недостающего или неопределенного значения:

Func<T_Users, bool> GetFunc(short? no = null, decimal? country = null) 
{ 
    return t => (no == null || t.No == (short)no) 
      && (countryNo == null || t.Country == (decimal)countryNo); 
} 

Примечание: это не точно так же, как ваш код, потому что я подозреваю, что ваш код имеет ошибку. Ваш последний if -statement является:

if (no == -1 && countryNo == -1) 
{ 
    exp = t => t.No != no && t.Country != countryNo; 
} 

... но я думаю, что вы имели в виду:

if (no == -1 && countryNo == -1) 
{ 
    // If 'no' and 'countryNo' are unspecified, anything is valid. 
    exp = t => true; 
} 

И я написал выше код с этим в виду.

Заключительное примечание: используйте более описательные имена, кроме no. Я не могу сказать, что такое no - это только код, который вы отправили, и через некоторое время вы не сможете сказать.

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