考虑以下情况:
public class Employee
{
public string Name {get; set}
public string Email {get; set}
}
public class EnployeeGroup
{
//List of employees in marketting
public IList<Employee> MarkettingEmployees{ get; }
//List of employees in sales
public IList<Employee> SalesEmployees{ get; }
}
private EnployeeGroup GroupA;
int MarkettingCount;
string MarkettingNames;
MarkettingCount = GroupA.MarkettingEmployees.Count; //assigns MarkettingCount=5, this will always be 5-10 employees
MarkettingNames = <**how can i join all the GroupA.MarkettingEmployees.Name into a comma separated string?** >
//I tried a loop:
foreach(Employee MktEmployee in GroupA.MarkettingEmployees)
{
MarkettingNames += MktEmployee.Name + ", ";
}
循环有效,但我想知道:
答案 0 :(得分:5)
无论你喜欢与否,你都需要一点LINQ;)
MarkettingNames = string.Join(", ", GroupA.MarkettingEmployees.Select(e => e.Name));
答案 1 :(得分:1)
从实用性的角度来看,避免循环没有合理的论据。迭代是每种通用编程语言的难点。
在简单的情况下使用LINQ非常优雅。同样,没有合理的理由可以避免它本身。
如果您正在寻找一个相当模糊的学术解决方案,那么总是tail recursion。但是,您的数据结构必须适应它。请注意,即使您使用它,智能编译器也会检测它并优化为循环。你的赔率很高!
答案 2 :(得分:0)
作为替代方案,您可以使用带有Append的StringBuilder,而不是在每次迭代时创建一个新字符串
答案 3 :(得分:0)
这会更有效率(请参阅下面的警告):
var stringBuilder = new StringBuilder();
foreach (Employee MktEmployee in GroupA.MarkettingEmployees)
{
stringBuilder.Append(MktEmployee.Name + ", ");
}
然后这个:
foreach(Employee MktEmployee in GroupA.MarkettingEmployees)
{
MarkettingNames += MktEmployee.Name + ", ";
}
编辑:如果您有大量员工, 会更有效率。然而,5-10的微不足道的循环实际上略微效率低。
在小的情况下 - 这不会对性能产生如此大的影响,但在大多数情况下,回报将是巨大的。
此外,如果您要使用显式循环方法,最好通过使用以下内容来修剪最后", "
:
myString = myString.Trim().TrimEnd(',');
下面的文章解释了何时应该使用StringBuilder
来连接字符串。
简而言之,在您使用的方法中:连接每次都会创建一个新字符串,这显然会占用大量内存。您还需要将现有字符串MarkettingNames
中的所有数据复制到另一个MktEmployee.Name + ", "
附加的新字符串。
谢谢你,Jon Skeet:http://www.yoda.arachsys.com/csharp/stringbuilder.html