检查测试条件值IN的C#if语句(就像在t-sql中一样)

Mar*_*bel 2 c# if-statement

我想知道是否可以使用像"IN"这样的关键字来测试C#中if语句中的条件?

原始代码:

if (fAuth.ShowDialog(this.DialogParent) == DialogResult.Cancel 
|| fAuth.ShowDialog(this.DialogParent) == DialogResult.Abort 
|| fAuth.ShowDialog(this.DialogParent) == DialogResult.None
|| fAuth.ShowDialog(this.DialogParent) == DialogResult.No)
return;
Run Code Online (Sandbox Code Playgroud)

我问怎么做这样的事情:

if (fAuth.ShowDialog(this.DialogParent) IN (DialogResult.Cancel,DialogResult.Abort,DialogResult.None,DialogResult.No)
return; 
Run Code Online (Sandbox Code Playgroud)

什么是正确的语法?

Fra*_*k J 6

我认为你的问题的精确答案就像CodeMaster已经在if语句匹配多个值时指出的那样

话虽这么说,因为你正在检查a DialogResult,在这个特定情况下,我怀疑性能考虑因素发挥作用,我们更多地考虑代码可读性(因为你可能不会向用户弹出10,000个对话框).

最简单的解决方案是提高可读性的switch语句:

switch(fAuth.ShowDialog(this.DialogParent))
{
    case DialogResult.Cancel:
    case DialogResult.Abort:
    case DialogResult.None:
    case DialogResult.No:
        return;
    default:
        break;
}
Run Code Online (Sandbox Code Playgroud)

问题在于,如果要在多个位置检查相同的内容,则可能需要重复代码.在这种情况下,我建议将其包装成这样的函数(根据您的喜好更改名称):

public class DialogEvaluator
{
    public static bool IsResultNegative(DialogResult result)
    {
        switch(fAuth.ShowDialog(this.DialogParent))
        {
            case DialogResult.Cancel:
            case DialogResult.Abort:
            case DialogResult.None:
            case DialogResult.No:
                return true;
            default:
                return false;
        }
    }
}

//And use it like that:
if(DialogEvaluator.IsResultNegative(fAuth.ShowDialog(this.DialogParent))
{
    return;
}
Run Code Online (Sandbox Code Playgroud)

如果你有一堆不同需求的不同情况,那么我会再次回到通用In方法并将可能的结果包装在命名良好的Lists中:

public static class DialogEvaluator
{
    public static bool In<T>(this T obj, IEnumerable<T> args)
    {
        return args.Contains(obj);
    }

    static DialogEvaluator
    {
        NegativeResult = new List<DialogResult>() { DialogResult.Cancel, DialogResult.Abort, DialogResult.None, DialogResult.No };
        SpecificNegativeResult = new List<DialogResult>() { DialogResult.Cancel, DialogResult.Abort, DialogResult.No };
    }

    public static List<DialogResult> NegativeResult {get; private set;}
    public static List<DialogResult> SpecificNegativeResult {get; private set;}
}

//And use it like that:
if (fAuth.ShowDialog(this.DialogParent)
     .In(DialogEvaluator.NegativeResult)
{
    return;
}
//Or
if (fAuth.ShowDialog(this.DialogParent)
     .In(DialogEvaluator.SpecificNegativeResult)
{
    return;
}
Run Code Online (Sandbox Code Playgroud)

这取决于您的具体情况,您必须平衡可读性,可维护性和简洁性.