带有string.Contains()的C#if语句无法按预期工作

时间:2013-11-01 16:17:47

标签: c# contains

我坚持认为这是一个非常容易的问题。如果UserAgent不包含一系列字符串,我试图将用户重定向到另一个网站。我无法弄清楚的部分是if语句在我使用下面的代码时工作正常。我对这个结果感到满意,但有些东西告诉我,如果声明证明是真的,那么只有一个else语句并且什么都不执行是不好的做法。

        string strUserAgent = Request.UserAgent.ToString().ToLower();

        if (strUserAgent != null)
        {
            if (Request.Browser.IsMobileDevice == true || 
                strUserAgent.Contains("iphone") ||
                strUserAgent.Contains("blackberry") || 
                strUserAgent.Contains("mobile") ||
                strUserAgent.Contains("windows ce") || 
                strUserAgent.Contains("opera mini") ||
                strUserAgent.Contains("palm") ||
                strUserAgent.Contains("android"))
            {
                // Is this normal practice to only have an else block?
            }else
            {
                Response.Redirect(AppState["redirectBack"].ToString());
            }

当我尝试下一个代码块时,无论UserAgent字符串包含什么,脚本都会重定向用户。有人可以解释为什么会发生这种情况吗?

        string strUserAgent = Request.UserAgent.ToString().ToLower();

        if (strUserAgent != null)
        {
            if (Request.Browser.IsMobileDevice != true || 
                !strUserAgent.Contains("iphone") ||
                !strUserAgent.Contains("blackberry") || 
                !strUserAgent.Contains("mobile") ||
                !strUserAgent.Contains("windows ce") || 
                !strUserAgent.Contains("opera mini") ||
                !strUserAgent.Contains("palm") ||
                !strUserAgent.Contains("android"))
            {
                 Response.Redirect(AppState["redirectBack"].ToString());
            }

6 个答案:

答案 0 :(得分:6)

使用!(“not”)反转您的陈述:

if(!(conditions)) { }

这样可以避免使用空代码块,只需删除else

当您不在移动设备上或当您的useragent包含以下任何字符串时,您的第二个代码块将重定向。这取决于您的输入和环境。

请注意,创建一系列可能性并检查您的使用者是否在那里更容易:

if(new[] {"iphone", "somephone", "otherphone" }.Any(x => useragent.Contains(x))) {}

答案 1 :(得分:6)

您需要De Morgan's Law。当你改变你的状态时,你的OR需要成为ANDs

答案 2 :(得分:3)

至少有一个条件是不正确的,这总是正确的。例如,如果strUserAgent.Contains(“blackberry”)为true,则strUserAgent.Contains(iphone)将为false。

您需要将OR(||)运算符更改为逻辑AND(&&)运算符。

    if (strUserAgent != null)
    {
        if (Request.Browser.IsMobileDevice != true && 
            !strUserAgent.Contains("iphone") &&
            !strUserAgent.Contains("blackberry") && 
            !strUserAgent.Contains("mobile") &&
            !strUserAgent.Contains("windows ce") && 
            !strUserAgent.Contains("opera mini") &&
            !strUserAgent.Contains("palm") &&
            !strUserAgent.Contains("android"))
        {
             Response.Redirect(AppState["redirectBack"].ToString());
        }

答案 3 :(得分:1)

不是答案,只是一个建议。您可以使用扩展方法使代码更清晰:

public static bool ContainsAnyOf(this string source, params string[] strings)
{
    return strings.Any(x => source.Contains(x));
}

现在写

if (strUserAgent.ContainsAnyOf("iphone", "blackberry", "mobile", "windows ce", "opera mini", "palm", "android"))
{
     //
}

答案 4 :(得分:0)

你需要扭转整个事情。放!A || !B!(A||B)不同。在第一个如果是A然后它不是B所以它是 True 。在第二个中,它是 False

   if (!(Request.Browser.IsMobileDevice == true || 
            strUserAgent.Contains("iphone") ||
            strUserAgent.Contains("blackberry") || 
            strUserAgent.Contains("mobile") ||
            strUserAgent.Contains("windows ce") || 
            strUserAgent.Contains("opera mini") ||
            strUserAgent.Contains("palm") ||
            strUserAgent.Contains("android")
      ) )
        {
            Response.Redirect(AppState["redirectBack"].ToString());
        }

答案 5 :(得分:0)

 string strUserAgent = Request.UserAgent.ToString().ToLower();

    if (strUserAgent != null)
    {
        if (!(Request.Browser.IsMobileDevice == true || 
            strUserAgent.Contains("iphone") ||
            strUserAgent.Contains("blackberry") || 
            strUserAgent.Contains("mobile") ||
            strUserAgent.Contains("windows ce") || 
            strUserAgent.Contains("opera mini") ||
            strUserAgent.Contains("palm") ||
            strUserAgent.Contains("android")))            
        {
            Response.Redirect(AppState["redirectBack"].ToString());
        }