Манипуляции со строками - это можно сделать лучше? - PullRequest
2 голосов
/ 17 декабря 2010

Прямо сейчас мы выполняем ручные входы, и одно из требований - наличие страницы входа. уведомить пользователя, к какому модулю они собираются войти. Теперь единственное, что мне нужно для работы с этим 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 ]

3 голосов
/ 17 декабря 2010

Да, более чистый путь был бы таким:

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;

Вы заметите, что мой код не создает меньше строковых экземпляров. Это связано с тем, что количество созданных здесь экземпляров строк никак не связано с вашей производительностью при обработке запроса.

2 голосов
/ 18 декабря 2010
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);
1 голос
/ 17 декабря 2010

Я бы не стал это менять. В лучшем случае вы сохраните несколько строк кода, но, как он есть, этот код, вероятно, более читабелен, поскольку он позволяет описательные имена строк на каждом этапе манипуляции.

Несмотря на то, что вы могли бы изучать функции библиотечных URL вместо реализации своих собственных.

0 голосов
/ 18 декабря 2010

На основе регулярного выражения 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);
}

Это хорошая идея, чтобы сделать это простым .

0 голосов
/ 17 декабря 2010

Я написал бы код, который получает часть между первым и вторым / с, как это:

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

Это довольно кратко, и IMO не сложнее понять.Кроме того, это избавляет вас от необходимости делать

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

, поэтому конечный результат на 3 строки короче без потери читаемости.

Редактировать:

Упрощенный вызов Split после комментария ОП о том, что будет только две косые черты.Вызов .Last(), конечно, можно заменить на [1], хотя лично я предпочитаю способ, которым читает .Last().Он передает намерение более ясно, чем магическое число, особенно если вы не являетесь автором кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...