在没有循环的情况下迭代IList中的对象属性

时间:2013-11-18 22:30:57

标签: c# ilist

考虑以下情况:

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 + ", ";
}

循环有效,但我想知道:

  1. 循环是最有效/优雅的方式吗?如果没有,那么更好的选择是什么?我试过string.join但是无法让它工作..
  2. 我想避开Linq ..

4 个答案:

答案 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