以有效的方式在循环中追加字符串
很长一段时间,我总是以下面的方式追加一个字符串。
例如,如果我想让所有员工姓名被某个符号分隔,在下面的例子中我为管道符号打开了。
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));
这种方法更好的三个原因:
-
它更简洁和可读 – 它表达了意图 ,而不是你想要如何实现你的目标(在你的
case在循环中连接字符串)。 使用Linq的简单投影也有帮助。 -
它由性能框架优化 :在大多数情况下,
string.Join()
将在内部使用StringBuilder
,因此您不会创建多个字符串,这些字符串随后将被引用并且必须进行垃圾回收。 另请参阅: 不要在循环内连接字符串 -
您不必担心特殊情况 。
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可能是更好的选择。