字符串操作 - 这可以做得更好吗?

时间:2010-12-17 20:27:10

标签: c# string

现在我们正在手动滚动登录,其中一个要求就是拥有登录页面 通知用户他们要登录的模块。现在我唯一需要工作的东西 如果它具有他们将要登陆的URL,则在查询字符串中,例如:

Request.QueryString["ReturnURL"]

使用如下值:

~/moduleFolder/SpecificPage.aspx

现在这是我创建的方法,可以通过正斜杠打破该URL, 取该段分隔单词,大写第一个单词,删除第一个斜杠, 并将其分配回标签以供显示。代码示例如下:

string incomingName = Request.QueryString["ReturnURL"].ToString();
int first = incomingName.IndexOf(@"/");
int last = incomingName.LastIndexOf(@"/");
string tempName = incomingName.Substring(first, last - first);
string seperatedName = Regex.Replace(tempName, "([a-z])([A-Z])", "$1 $2");
string upperCased = seperatedName.Replace("/", "");
string portalName = char.ToUpper(upperCased[0]) + upperCased.Substring(1);
lblPortalName.Text = portalName;    

是否有更清晰或更好的方法来编写此代码而没有新字符串的这么多不同实例?

5 个答案:

答案 0 :(得分:3)

是的,更清洁的方式是这样的:

private static string GetMiddleSegment(string URL)
{
    // you should probably use a library function for this kind of thing

    int first = URL.IndexOf(@"/");
    int last = URL.LastIndexOf(@"/");
    return URL.Substring(first + 1, last - first - 1); // this is correct, right?
}

private static string SeparateWords(string camelCase)
{
    return Regex.Replace(camelCase, "([a-z])([A-Z])", "$1 $2");
}

private static string Uppercase(string name)
{
    return char.ToUpper(name[0]) + name.Substring(1);
}

// ...

string incomingURL = Request.QueryString["ReturnURL"].ToString();
string nameSegment = GetMiddleSegment(incomingURL);
string displayName = Uppercase(SeparateWords(nameSegment));
lblPortalName.Text = displayName;

您会注意到我的代码不会创建更少的字符串实例。那是因为在这里创建的字符串实例数量与提供请求时的性能完全无关。

答案 1 :(得分:2)

string url = "~/moduleFolder/SpecificPage.aspx";
string moduleFolder = url.Split('/')[1];
string separatedName = Regex.Replace(moduleFolder, "([a-z])([A-Z])", "$1 $2");
string portalName = CultureInfo.CurrentCulture.TextInfo.ToTitleCase(separatedName);

答案 2 :(得分:1)

我不会改变它。最好你会保存几行代码,但事实上,这段代码可能更具可读性,因为这样可以在操作的每一步都有字符串的描述性名称。

虽然您可能会查看库网址功能,而不是实现自己的功能。

答案 3 :(得分:0)

我会编写代码来获取第一个和第二个之间的部分,如下所示:

var tempName = incomingName.Split('/').Last();

这很苛刻,IMO也不难理解。此外,它还为您省去了

的麻烦
string upperCased = seperatedName.Replace("/", "");

所以最终结果是3行更短而不会损失可读性。

修改

在OP的评论之后简化了Split调用,只会有两个斜杠。 .Last()调用当然可以替换为[1],但我个人更喜欢.Last()读取的方式。它比一个神奇的数字更清楚地传达意图,特别是如果你不是代码的作者。

答案 4 :(得分:0)

基于 RedFilter的正则表达式,您可以创建简单的扩展方法,如:

private static string UrlModuleName(this string url)
{
    return Regex.Replace(url.Split('/')[1], "([a-z])([A-Z])",
                         "$1 $2").ToTitleCaseInvariant();
}
private static string ToTitleCaseInvariant(this string input)
{
    return CultureInfo.InvariantCulture.TextInfo.ToTitleCase(input);
}

这是一个很好的想法,让它变得简单