簡體   English   中英

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

[英]String manipulation - Can this be made better?

現在,我們正在手動滾動登錄,其中一項要求是讓登錄頁面通知用戶他們要登錄哪個模塊。 現在,我唯一需要使用的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;    

有沒有一種更干凈或更完善的方法來編寫此代碼,而又沒有太多不同的新字符串實例?

是的,更干凈的方法是這樣的:

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;

您會注意到,我的代碼並沒有創建更少的字符串實例。 那是因為絕對不可能在這里創建的字符串實例的數量與服務請求時的性能有關。

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);

我不會改變。 充其量您可以節省幾行代碼,但實際上,此代碼可能更具可讀性,因為這允許在每個操作步驟中使用字符串的描述性名稱。

雖然您可能會研究庫的url函數,而不是自己實現。

我將編寫這樣的代碼來獲得第一個和第二個/ s之間的部分:

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

這是相當麻煩的,IMO也就不難理解了。 另外,它省去了您做麻煩的事情

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

因此最終結果縮短了3行,而不會損失可讀性。

編輯:

在OP聲明只有兩個斜杠之后,簡化了Split調用。 .Last()調用當然可以用[1]代替,盡管我個人更喜歡.Last()讀取方式。 與魔術數字相比,它傳達的意圖更清晰,尤其是如果您不是代碼的作者。

根據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);
}

讓它變得簡單是一個好主意

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM