2013-11-18 3 views
0

Рассмотрим следующую ситуацию:Перебор свойств объекта в 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 ..
+1

А почему вы хотите, чтобы избежать LINQ точно? –

+0

Хотя я бы хотел знать, как это сделать в Linq, но мне любопытно узнать, есть ли способ достичь этого без Linq – user3006467

+0

Ну, я бы сказал, что лучшей альтернативой является LINQ .... но –

ответ

5

Вам нужно немного LINQ, нравится ли вам это или нет;)

MarkettingNames = string.Join(", ", GroupA.MarkettingEmployees.Select(e => e.Name)); 
+2

+1 потому что ваше редактирование заставило меня посмеяться (и ваш ответ на 100% правильный). – Brian

+0

Я довольно новичок в LINQ, так как это решение LINQ сравнивается с циклом с точки зрения эффективности, элегантности, производительности, удобочитаемости и т. Д.? – user3006467

+0

LINQ в общем случае не быстрее, чем циклы, поскольку он также использует их (неявно). Но 'string.Join' очень эффективен (тем более со списком или массивом) и' Enumerable.Select' просто проектирует 'Employee.Name'. Поэтому, на мой взгляд, этот подход эффективен, лаконичен, изящен и наиболее важен: читабельна и удобна в обслуживании. –

0

В качестве альтернативы вы можете использовать StringBuilder с Append вместо создания новой строки на каждой итерации

1

С практической точки зрения нет разумных аргументов в пользу исключения цикла. Итерации находятся на жестком уровне каждый язык программирования общего назначения.

Использование LINQ элегантно в простых случаях. Опять же, нет разумной причины, чтобы избежать ее как таковой.

В случае, если вы ищете довольно неясное, научное решение, всегда есть tail recursion. Тем не менее, ваша структура данных должна быть адаптирована для этого. Обратите внимание, что даже если вы его используете, интеллектуальный компилятор обнаружит его и оптимизирует в цикл. Шансы снова вам!

0

Это было бы гораздо более эффективным (см замечание ниже):

var stringBuilder = new StringBuilder(); 
foreach (Employee MktEmployee in GroupA.MarkettingEmployees) 
{ 
    stringBuilder.Append(MktEmployee.Name + ", "); 
} 

Тогда это:

foreach(Employee MktEmployee in GroupA.MarkettingEmployees) 
{ 
    MarkettingNames += MktEmployee.Name + ", "; 
} 

Edit: Если вы должны были иметь большое количество сотрудников этого бы быть намного более эффективным. Однако тривиальная петля 5-10 на самом деле немного менее эффективна.

В небольших случаях - это не будет большой удар по производительности, но в больших случаях окупаемость будет значительной.

Кроме того, если вы будете использовать подход явного цикла, это, вероятно, лучше обрезать, что последний ", ", используя что-то вроде:

myString = myString.Trim().TrimEnd(','); 

В статье ниже объясняет, когда вы должны использовать StringBuilder для конкатенации строк ,

Вкратце, в подходе, который вы используете: конкатенация создает новую строку каждый раз, что, очевидно, поглощает много памяти. Вам также необходимо скопировать все данные из существующей строки MarkettingNames в новую добавляемую строку еще MktEmployee.Name + ", ".

Спасибо, Джон Скит: http://www.yoda.arachsys.com/csharp/stringbuilder.html

+0

Действительно ли StringBuilder имеет смысл, если мой цикл повторяется только 5-10 раз? – user3006467

+0

Я обновил свой ответ для вас. –

 Смежные вопросы

  • Нет связанных вопросов^_^