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

带有string.Contains()的C#if语句未按预期工作,c#,contains,C#,Contains,我被困在一个我认为很容易解决的问题上。如果UserAgent不包含一系列字符串,我将尝试将用户重定向到其他网站。我不明白的是,如果我使用下面的代码,if语句工作得很好。我对这个结果很满意,但有些事情告诉我,只有一个else语句,如果该语句被证明是正确的,则什么也不执行,这不是一种好的做法 string strUserAgent = Request.UserAgent.ToString().ToLower(); if (strUserAgent != null)

我被困在一个我认为很容易解决的问题上。如果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());
            }

使用
反转您的语句(“非”):

这将避免使用空代码块,您只需删除
else

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

请注意,创建一个可能性集合并检查您的useragent是否在其中要容易得多:

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

你需要把整个事情颠倒过来。放
!A | | |!B
不同!(A | | B)
。在第一个例子中,如果它是A,那么它不是B,所以它是真的。第二个是假的


至少有一个条件是不正确的,这是事实。例如,如果strusagent.Contains(“blackberry”)为true,则if strusagent.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());
        }

你需要。当你改变你的状态时,你的ORs需要变成ANDs,而不是一个答案,只是一个建议。您可以使用扩展方法使代码更干净:

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"))
{
     //
}

顺便说一下,与其让这个庞大的
包含
块,不如将所有字符串放入一个集合中,然后对其执行
包含
?这会大大简化它。你把它颠倒错了。通过将
==
更改为
=
包含
!包含
,但保持
|
的原样,仅当所有
包含
都为真时才进入块。您可以将所有的
|
s更改为
&&
s,或者撤消单个否定并用
包装整个内容!()
。根据哪个更容易阅读,您可以将整个内容包装在
或反转每个布尔值(
!=
!strusagent.Contains(…)
)并将
|
交换为
&
。显示的内容需要精确匹配,而如果用户代理包含一个stings,则问题匹配。该
数组包含的
是反向的。您可以执行
new[]{…}.Any(x=>useragent.Contains(x))
。忽略了这一部分,这一点很好。我已经编辑过了,谢谢你优雅的解决方案。+1,我的想法完全一样,这是最好的答案。这是更容易给予编程answer@SatpalAllenG也是正确的,他并不懒得键入代码。@cadrell0-通常我是。今天早上我只是心情很好。
    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());
        }
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"))
{
     //
}