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