C# 在IList中迭代对象属性而不使用循环
考虑以下情况:C# 在IList中迭代对象属性而不使用循环,c#,ilist,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 emp
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 + ", ";
}
公共类员工
{
公共字符串名称{get;set}
公共字符串电子邮件{get;set}
}
公共类部署组
{
//市场营销部员工名单
公共IList MarketingEmployees{get;}
//销售部员工名单
公共IList SalesEmployees{get;}
}
私人雇员团体A组;
国际市场计数;
字符串名称;
MarketingCount=GroupA.MarketingEmployees.Count//分配MarketingCount=5,这将始终是5-10名员工
市场名称=
//我尝试了一个循环:
foreach(A组中的员工MktEmployee.MarketingEmployees)
{
marketingnames+=MktEmployee.Name+“,”;
}
循环是有效的,但我想知道:
不管你喜欢与否,你都需要一点灵气;)
不管你喜欢与否,你都需要一点灵气;)
作为替代方案,您可以使用带有Append的StringBuilder,而不是在每次迭代时创建新字符串作为替代方案,您可以使用带有Append的StringBuilder,而不是在每次迭代时创建新字符串从实用角度来看,没有合理的理由避免循环。迭代是每种通用编程语言的难点 在简单的情况下,使用LINQ非常优雅。再说一次,没有合理的理由去避免它本身
如果你正在寻找一个相当模糊的,学术性的解决方案,总会有。但是,您的数据结构必须适应它。请注意,即使您使用它,智能编译器也会检测到它并将其优化为循环。机会对你不利 从实用的角度来看,没有合理的理由避免循环。迭代是每种通用编程语言的难点 在简单的情况下,使用LINQ非常优雅。再说一次,没有合理的理由去避免它本身
如果你正在寻找一个相当模糊的,学术性的解决方案,总会有。但是,您的数据结构必须适应它。请注意,即使您使用它,智能编译器也会检测到它并将其优化为循环。机会对你不利 这将更有效率(参见下面的警告): 那么这个,
foreach(Employee MktEmployee in GroupA.MarkettingEmployees)
{
MarkettingNames += MktEmployee.Name + ", ";
}
编辑:如果你有大量的员工,这会更有效率。然而,一个5-10的小循环实际上效率稍低。
在小的情况下-这不会对性能造成太大的影响,但在大的情况下,回报将是巨大的。
此外,如果要使用显式循环方法,可能最好使用以下方法修剪最后的“,”
:
myString = myString.Trim().TrimEnd(',');
下面的文章解释了何时应该使用StringBuilder
连接字符串
简而言之,在您使用的方法中:串联每次都创建一个新字符串,这显然会占用大量内存。您还需要将marketingnames
的现有字符串中的所有数据复制到另一个MktEmployee.Name+“,”
追加的新字符串中
谢谢你,Jon Skeet:这会更有效率(请参见下面的警告): 那么这个,
foreach(Employee MktEmployee in GroupA.MarkettingEmployees)
{
MarkettingNames += MktEmployee.Name + ", ";
}
编辑:如果你有大量的员工,这会更有效率。然而,一个5-10的小循环实际上效率稍低。
在小的情况下-这不会对性能造成太大的影响,但在大的情况下,回报将是巨大的。
此外,如果要使用显式循环方法,可能最好使用以下方法修剪最后的“,”
:
myString = myString.Trim().TrimEnd(',');
下面的文章解释了何时应该使用StringBuilder
连接字符串
简而言之,在您使用的方法中:串联每次都创建一个新字符串,这显然会占用大量内存。您还需要将marketingnames
的现有字符串中的所有数据复制到另一个MktEmployee.Name+“,”
追加的新字符串中
谢谢你,Jon Skeet:那你为什么要避开LINQ呢?虽然我很想知道如何在LINQ中做到这一点,但我很好奇,如果没有LINQ,是否有办法做到这一点。我想说,更好的选择是LINQ。。。。but@user3006467你不想使用循环,也不想使用Linq?这两个限制似乎都是完全武断的。@p.s.w.g作业通常是武断的。你为什么要完全避免LINQ?虽然我很想知道如何在LINQ中做到这一点,但我很好奇,如果没有LINQ,是否有办法做到这一点。我想说,更好的选择是LINQ。。。。but@user3006467你不想使用循环,也不想使用Linq?这两个限制似乎都是完全武断的。@p.s.w.g作业通常是武断的。+1因为您的编辑让我发笑(而且您的答案是100%正确)。我对LINQ相当陌生,那么这个LINQ解决方案与循环在效率、优雅性、性能等方面相比如何,可读性等?LINQ一般不比循环快,因为它也(隐式地)使用循环。但是
string.Join
非常有效(尤其是在列表或数组中),而且是可枚举的。选择只需投影Employee.Name
。因此,在我看来,这种方法是高效、简洁、优雅的,而且最重要的是:可读性和可维护性。+1因为您的编辑让我发笑(您的答案100%正确)。我对LINQ相当陌生,那么这种LINQ解决方案在效率、优雅性、性能方面与循环相比如何,可读性等?LINQ一般不比循环快,因为它也(隐式地)使用循环。但是