以有效的方式在循环中追加字符串

很长一段时间,我总是以下面的方式追加一个字符串。

例如,如果我想让所有员工姓名被某个符号分隔,在下面的例子中我为管道符号打开了。

string final = string.Empty;

foreach(Employee emp in EmployeeList) { final+=emp.Name+"|"; // if i want to separate them by pipe symbol } 

最后我做一个子串并删除最后一个管道符号,因为它不是必需的

 final=final.Substring(0,final.length-1); 

有没有有效的方法来做到这一点。

我不想为最后一项添加管道符号并再次执行子字符串。

使用string.Join()和Linq投影改为Select()

 finalString = string.Join("|", EmployeeList.Select( x=> x.Name)); 

这种方法更好的三个原因:

  1. 它更简洁和可读 – 它表达了意图 ,而不是你想要如何实现你的目标(在你的
    case在循环中连接字符串)。 使用Linq的简单投影也有帮助。

  2. 它由性能框架优化 :在大多数情况下, string.Join()将在内部使用StringBuilder ,因此您不会创建多个字符串,这些字符串随后将被引用并且必须进行垃圾回收。 另请参阅: 不要在循环内连接字符串

  3. 您不必担心特殊情况string.Join()自动处理“最后一项”的情况,之后您不需要另一个分隔符,这再次简化了代码并使其不易出错。

你应该加入你的字符串。

示例(从MSDN借来):

 using System; class Sample { public static void Main() { String[] val = {"apple", "orange", "grape", "pear"}; String sep = ", "; String result; Console.WriteLine("sep = '{0}'", sep); Console.WriteLine("val[] = {{'{0}' '{1}' '{2}' '{3}'}}", val[0], val[1], val[2], val[3]); result = String.Join(sep, val, 1, 2); Console.WriteLine("String.Join(sep, val, 1, 2) = '{0}'", result); } } 

我喜欢在linq中使用聚合函数,例如:

 string[] words = { "one", "two", "three" }; var res = words.Aggregate((current, next) => current + ", " + next); 

对于最终的管道问题,只需将最后一个附加保留在循环外部即可

 int size = EmployeeList.length() for(int i = 0; i < size - 1; i++) { final+=EmployeeList.getEmployee(i).Name+"|"; } final+=EmployeeList.getEmployee(size-1).Name; 

对于这样的构建, StringBuilder可能是更好的选择。