在制作动态网址时执行字符串连接的最佳方法是什么?

时间:2010-07-30 07:16:21

标签: c# c#-3.0

我正在运行时构建一个URL。到目前为止,我已经完成了

public string BuildURLAndNavigate(CodeType codeType)
{    
    string vURL = string.Empty; 

    string mstrNavServer = "http://some.com/nav";
    vURL = ConcatenateString(mstrNavServer , "/somepage.asp?app=myapp");

    //Build Code Type
    switch (codeType)
    {
    case CodeType.Series:
        vURL = ConcatenateString(vURL , "&tools=ser");
        break; 
    case CodeType.DataType:
        vURL = ConcatenateString(vURL , "&tools=dt");
        break;
    }

    //build version 
    string VER_NUM = "5.0";
    vURL = ConcatenateString(vURL , ConcatenateString("&vsn=" , VER_NUM));         
    return vURL;
    }

    private string ConcatenateString(string expression1, string expression2)
    {
        return string.Concat(expression1 + expression2);
    }

但我对我正在做的那个感到不满。

我确信这绝对是一种最佳做法/更好的方法。

请帮助我指导相同的事情。

由于

9 个答案:

答案 0 :(得分:8)

您可以使用StringBuilder

public string BuildURLAndNavigate(CodeType codeType) 
{  
    StringBuilder vURL = new StringBuilder();

    vURL.Append("http://some.com/nav"); 
    vURL.Append("/somepage.asp?app=myapp"); 

    //Build Code Type 
    switch (codeType) 
    { 
        case CodeType.Series: 
            vURL.Append("&tools=ser"); 
            break;  
        case CodeType.DataType: 
            vURL.Append("&tools=dt"); 
            break; 
    } 

    //build version  
    string VER_NUM = "5.0"; 
    vURL.AppendFormat("&vsn={0}", VER_NUM);          

    return vURL.ToString(); 
} 

答案 1 :(得分:7)

从不使用字符串,字符串构建器,字符串连接构建网址。

您可以从定义一个自定义集合开始,该集合将正确地对任何添加到其中的值进行URL编码:

public class HttpNameValueCollection : NameValueCollection
{
    public override void Add(string name, string value)
    {
        base.Add(name, HttpUtility.UrlEncode(value));
    }

    public override string ToString()
    {
        return string.Join("&", Keys.Cast<string>().Select(
            key => string.Format("{0}={1}", key, this[key])));
    }
}

然后简单地说:

public string BuildURLAndNavigate()
{
    var uriBuilder = new UriBuilder("http://some.com/nav/somepage.asp");
    var values = new HttpNameValueCollection();
    values.Add("app", "myapp");

    switch (codeType)
    {
        case CodeType.Series:
            values.Add("tools", "ser");
            break;
        case CodeType.DataType:
            values.Add("tools", "dt");
            break;
    }

    // You could even do things like this without breaking your urls
    values.Add("p", "http://www.example.com?p1=v1&p2=v2");


    string VER_NUM = "5.0";
    values.Add("vsn", VER_NUM);
    uriBuilder.Query = values.ToString();
    return uriBuilder.ToString();
}

答案 2 :(得分:2)

你做得很好 - 这很简单易懂。任何阅读代码的人都可以理解你在做什么。

就性能而言 - 你没有做太多的字符串操作,所以除非你正在构建庞大的字符串或每分钟执行几次这样的操作,否则使用StringBuilder不会获得太多收益。在优化此代码之前,请测试其性能。你可能会发现还有其他更大的瓶颈可以解决。

我唯一真实的评论是你的ConcatenateString功能似乎是多余的。它并没有真正在代码中添加任何内容,所有对它的调用都可以简单地替换为string.Concat。正如@abatishchev的回答中所提到的,你应该使用(str1, str2)而不是(str1 + str2),因为这会打败电话会议的原因。

答案 3 :(得分:2)

与Saxon Druce一样说:你可以使用StringBuilder,但是,根据CodeType值,你也可以消除开关:

public string BuildURLAndNavigate(CodeType codeType) 
{  
    StringBuilder vURL = new StringBuilder();

    vURL.Append("http://some.com/nav"); 
    vURL.Append("/somepage.asp?app=myapp"); 

    //Build Code Type 
    vURL.Append(codeType == CodeType.Series ? "&tools=ser" : "&tools=dt");

    //build version  
    string VER_NUM = "5.0"; 
    vURL.AppendFormat("&vsn={0}", VER_NUM);          

    return vURL.ToString(); 
} 

答案 4 :(得分:2)

待办事项

return string.Concat(expression1, expression2);

return string.Concat(expression1 + expression2);

答案 5 :(得分:2)

不正确的方法是使用Uri类或UriBuilder类吗?

例如Uri ctor重载Uri(Uri,字符串):

public Uri(
   Uri baseUri,
   string relativeUri
);


Uri baseUri = new Uri("http://www.contoso.com");
Uri myUri = new Uri(baseUri, "catalog/shownew.htm");
Console.WriteLine(myUri.ToString());

http://msdn.microsoft.com/en-us/library/aa332624(v=VS.71).aspx

答案 6 :(得分:0)

是的,StringBuilder是最好的解决方案。您可以在MSDN页面上找到更多信息:http://msdn.microsoft.com/en-us/library/system.text.stringbuilder.aspx

StringBuilder包含非常有用的方法:

StringBuilder.Append
将信息附加到当前StringBuilder的末尾。

StringBuilder.AppendFormat
替换带有格式化文本的字符串中传递的格式说明符。

StringBuilder.Insert
将字符串或对象插入当前StringBuilder的指定索引中。

StringBuilder.Remove
从当前的StringBuilder中删除指定数量的字符。

StringBuilder.Replace
替换指定索引处的指定字符。

答案 7 :(得分:0)

我个人倾向于将字符串格式化为:

public string BuildURLAndNavigate(CodeType codeType)
{    
    string vURL = "http://some.com/nav/somepage.asp?app=myapp&tools={0}&vsn={1}"; 
    string codevalue = "";
    //Build Code Type
    switch (codeType)
    {
    case CodeType.Series:
        codevalue = "ser";
        break; 
    case CodeType.DataType:
        codevalue = "dt";
        break;
    }

    //build version 
    string version = "5.0";
    return string.Format(vURL, codevalue, version);
    }
}

道歉,如果有任何错误,我在写作时不在VS中,所以可能会有一些我没有注意到的错别字 - 你应该明白这个想法。

我喜欢这种方法的原因是因为你可以立即看到你的网址整体形式是什么,这可以让你更容易理解返回的网址是什么。

答案 8 :(得分:0)

为了将所有变量保存在一个地方,我们可以使用以下解决方案

public string BuildURLAndNavigate(CodeType codeType) 
    {
        //code here - switch statement to calculate the codeValue

        //Anonymous type - To keep all variables at one place    
        var urlComponents = new {
                                server = "http://some.com/nav",
                                pageName="/somepage.asp?app=myapp",
                                codevalue = "", //Replace with the actual value calculated in switch statement
                                versionPart="&vsn=",
                                version = "5.0" 
                                };


        StringBuilder vURL = new StringBuilder();
        vURL.Append(urlComponents.server);
        vURL.Append(urlComponents.pageName);
        vURL.Append(urlComponents.codevalue);
        vURL.Append(urlComponents.versionPart);
        vURL.Append(urlComponents.version);
        return vURL.ToString();

    }