我想重构这段代码。也许如果可能的话,使用开关?或者在性能方面是否相同?
string rawUrl = context.Request.RawUrl ?? string.Empty;
if (rawUrl.Contains("mypage.aspx"))
{
}
if (rawUrl.Contains("mypage2.aspx"))
{
}
etc..
答案 0 :(得分:4)
不直接,因为你想要一个“包含”关系,而不是完全相等。
但是,如果您愿意,可以通过尝试从我认为的URL中解析页面名称,将其存储在单独的String
变量中,然后启用String
来实现间接。 1}}。
例如:
// Get the URL from some external source (wherever you're already getting it from)
String rawUrl = "http://www.example.com/foo/bar.aspx";
// Means of parsing will be dependent on the format in which you expect the URL.
String page = rawUrl.Substring(rawUrl.LastIndexOf("/") + 1);
switch (page) {
case "bar.aspx":
// Do stuff
break;
case "foo.aspx":
// Do stuff
break;
}
当然,请将这种解析方法与一粒盐一起使用;这个例子是为了告诉你这是可能的,但请注意,这种解析方法可能会在很多情况下引发异常,但为了简洁起见,我省略了这些检查。
答案 1 :(得分:3)
Switch Cases必须是一个常量值。你最好选择使用if / else之类的:
string rawUrl = context.Request.RawUrl ?? string.Empty;
if (rawUrl.Contains("mypage.aspx"))
{
//code
}
else if (rawUrl.Contains("mypage2.aspx"))
{
//more code
}
如果你担心表现(这很好!)那么其他方法就是你要走的路。虽然不使用else将具有相同的功能,但通过添加else,您告诉代码不处理任何其他条件。因此10 if语句将导致10如果处理条件无关紧要,而10 if / else语句可能导致10,或者它可能只导致1。
编辑:
考虑到这一点,我注意到你正在使用上下文对象。如果您真的想要一个switch语句,可以执行以下操作:
string page = context.Request.Url.Segments.Last();
switch(page)
{
case "mypage.aspx":
//code
break;
case "mypage2.aspx":
//more code
break;
}
答案 2 :(得分:1)
不适用于包含。
尝试单独隔离页面名称,您可以这样做。
switch(pageName)
{
case "mypage.aspx";
break;
case "mypage2.aspx";
break;
}
答案 3 :(得分:0)
我认为最好使用Dictionary
。
首先,从原始网址中提取文件名。
然后,使用Dictionary<string,TValue>
。
如果对页面的操作几乎相同,请将TValue
设置为与页面关联的数据类型。
如果操作非常不同,请将TValue
设置为委托类型,例如Action
。