代码之家  ›  专栏  ›  技术社区  ›  user372724

在创建动态URL时,执行字符串串联的最佳方法是什么?

  •  1
  • user372724  · 技术社区  · 15 年前

    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 回复  |  直到 15 年前
        1
  •  7
  •   Darin Dimitrov    15 年前

    从未

    您可以从定义自定义集合开始,该集合将负责对添加到其中的任何值进行正确的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
  •  8
  •   Saxon Druce    15 年前

    你需要一个 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(); 
    } 
    
        3
  •  2
  •   Daren Thomas    15 年前

    就像撒克逊德鲁塞说的:你可以使用 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 
        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
  •   abatishchev Karl Johan    15 年前

    return string.Concat(expression1, expression2);
    

    return string.Concat(expression1 + expression2);
    
        5
  •  2
  •   santa    15 年前

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

    例如,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
  •  2
  •   Oded    15 年前

    你所做的一切都很好——简单易懂。任何读代码的人都能理解你在做什么。

    就性能而言,您没有进行太多的字符串操作,因此除非您构建巨大的字符串或每分钟执行数千次此操作,否则使用StringBuilder不会获得太多收益。在优化此代码之前,请测试其性能。您可能会发现,还有其他更大的瓶颈需要首先解决。

    ConcatenateString 功能似乎是多余的。它实际上并没有向代码中添加任何内容,对它的所有调用都可以用 string.Concat . 正如@abatishchev的回答中提到的,您应该使用 (str1, str2) (str1 + str2) ,因为这不符合打电话的理由。

        7
  •  0
  •   Pavel Morshenyuk    15 年前

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

    StringBuilder包含非常有用的方法:

    StringBuilder.附加

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

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


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


    替换指定索引处的指定字符。

        8
  •  0
  •   Chris    15 年前

    我个人倾向于使用string.format这样的格式:

    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写的时候,所以可能有一些打字错误,我没有注意到-你应该得到的想法,虽然。

        9
  •  0
  •   akapoor    15 年前

    为了使所有的变量保持在一个地方,我们可以使用下面的解决方案吗

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