用逗号连接字符串以连接长字符串

本文关键字:字符串 连接 | 更新日期: 2023-09-27 18:21:04

我得到了一个以下类的列表。

 public class SmsResponse
    {
        public string AliasName { get; set; }
        public string CellPhoneNumber { get; set; }
        public int Response { get; set; }
    } 

正在将此列表传递给一个函数以检查响应字段是否具有 0 以外的响应,如果有,则为错误,我必须通过此方法准备一个状态字符串PrepareStatusString();

bool isSuccess = EvaluateSmsResponse(responseList);  //list of smsresponse class
private bool EvaluateSmsResponse(List<SmsResponse> smsResponseList)
    {
        bool isSent = smsResponseList.Exists(response => response.Response != 0);
        if (!isSent)
            PrepareStatusString(smsResponseList);
        return isSent;
    }
     private void PrepareStatusString(List<SmsResponse> responseList)
    {
        bool isfirst = true;
        foreach (var item in responseList)
        {
            if (item.Response != 0)
            {
                if(isfirst)
                    StatusDescription += item.AliasName + "|" + item.CellPhoneNumber + "|" + item.Response.ToString();
                else
                    StatusDescription += "," + item.AliasName + "|" + item.CellPhoneNumber + "|" + item.Response.ToString();
                isfirst = false;
            }
        }
    }

代码正在按预期工作,但可以以任何方式优化/改进。我觉得范围有所改进,但无法弄清楚??

用逗号连接字符串以连接长字符串

如果使用的是 .NET 4 或更高版本,则可以重写SmsResponse.ToString(),然后使用 String.Join<T>(String, IEnumerable<T>) 连接响应。

因此,您的SmsResponse类可能如下所示:

public class SmsResponse
{
    public string AliasName { get; set; }
    public string CellPhoneNumber { get; set; }
    public int Response { get; set; }
    public override string ToString()
    {
        return AliasName + "|" + CellPhoneNumber + "|" +
            Response.ToString();
    }
}

PrepareStatusString将是:

private void PrepareStatusString(List<SmsResponse> responseList)
{
    StatusDescription = string.Join(",", responseList.Where(i => i.Response != 0));
}
StringBuilder

foreach循环中附加字符串时会更有效(取决于迭代次数(

private void PrepareStatusString(List<SmsResponse> responseList)
{
    bool isfirst = true;
    StringBulder sb = new StringBuilder();
    foreach (var item in responseList)
    {
        if (item.Response != 0)
        {
            if(isfirst)
                sb.AppendFormat("{0}|{1}|{2}", item.AliasName, item.CellPhoneNumber,item.Response.ToString());
            else
                sb.AppendFormat(",{0}|{1}|{2}", item.AliasName, item.CellPhoneNumber, item.Response.ToString());
            isfirst = false;
        }
    }
    StatusDescription = sb.ToString();
}
我不知道

优化,但它可以更富有表现力地重写如下:

private void PrepareStatusString(List<SmsResponse> responseList)
{
    StatusDescription = responseList
         .Where(x => x.Response != 0)
         .Select(x => x.AliasName 
                    + "|" + x.CellPhoneNumber 
                    + "|" + x.Response.ToString())
         .Aggregate((x, y) => x + "," + y);
}

请注意,只有当您期望那里有超过几百个对象时,StringBuilder才会提供明显的性能优势。

这样

使用string.Join

    List<string> elements = new List<string>();
    foreach (var item in responseList)
    {
        if (item.Response != 0)
        {
            elements.add(item.AliasName + "|" + item.CellPhoneNumber + "|" + item.Response.ToString());
        }
    }
    string result = string.Join(",", elements.ToArray());