2013-02-25 2 views
1

Я пытаюсь добавить несколько строк в MailAddress на C#.ForEach и foreach

Если бы я должен был использовать ForEach, мой код будет выглядеть

 foreach (var item in GetPeopleList()) 
     { 
      m.Bcc.Add(new MailAddress(item.EmailAddress)); 
     } 

Я сейчас пытаюсь сделать это с моим Еогеаспом (т.е. List.ForEach()), и я не могу.

public class Person 
    { 
     public Person(string firstName, string lastName, string emailAddress) 
     { 
      FirstName = firstName; 
      LastName = lastName; 
      EmailAddress = emailAddress; 
     } 

     public string FirstName { get; set; } 
     public string LastName { get; set; } 
     public string EmailAddress { get; set; } 
    } 

     static void Main(string[] args) 
     { 
      MailMessage m = new MailMessage(); 
      List<Person> people = GetPeopleList(); 

      m.Bcc.Add(people.ForEach(Person people => 
       { 
        //what goes here? 
       } 
      )); 
     } 

     private static List<Person> GetPeopleList() 
     { 
      List<Person> peopleList = new List<Person>(); 
      //add each person, of type Person, to the list and instantiate the class (with the use of 'new') 
      peopleList.Add(new Person("Joe", "Bloggs", "[email protected]")); 
      peopleList.Add(new Person("John", "Smith", "[email protected]")); 
      peopleList.Add(new Person("Ann", "Other", "[email protected]")); 
      return peopleList; 
     } 

Я пробовал несколько вариантов/вариантов этого, но я явно делаю что-то неправильно. Я прочитал об этом Eric Lippert's page и, к сожалению, это тоже не помогло.

+0

Что не работает? – Woot4Moo

+1

Ваш вопрос неправильный. Вы написали: «Если бы я использовал ForEach», а затем использовал 'foreach' ... –

+0

Надеюсь, вы не делаете этого ни для чего большего, кроме учебного упражнения. 'List.ForEach()' не предполагается использовать так, как вы его пытаетесь использовать, а версия, которую вы уже получили, понятна. – JLRishe

ответ

5

Вам потребуется что-то вроде

people.ForEach(Person p => { 
    m.Bcc.Add(new MailAddress(p.EmailAddress)); 
}); 

Вместо добавления одного диапазона выбранных элементов с ForEach, вы добавляете один пункт ForEach человека в списке.

Это сказало ... Я бы предпочел обычный цикл foreach.

-1

Я не знаю, если я правильно понимаю, но попробуйте:

foreach (var item in GetPeopleList()) 
{ 
    m.Bcc.Add(item.EmailAddress)); 
} 

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

+0

OP имеет стандартную работу 'foreach', он хочет, чтобы функция была объяснена в блоге OP. – Woot4Moo

1

Прямая цитата из блога:

Вторая причина заключается в том, что делать это добавляет нулевой новый изобразительный власть языка. Это позволит вам полностью переписать код :

foreach (Foo foo in foos) {statement with foo; }

в этот код:

foos.ForEach ((Foo Foo) => {заявление с участием Foo;});

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

Эрик Липперт явно призывает не делать этого.

+0

Спасибо за это. Да, я прочитал это, но, как часть своей практики, я хотел использовать ее/испытать ее. Благодарю вас, большое дело. – Dave

+0

@Woot Вопрос является чисто синтаксическим, а не «пожалуйста, скажите мне, чтобы я не использовал эту функцию языка, я пытаюсь выяснить, как использовать». – Rawling

+0

@DaveRook понятно. Однако всегда помните, чтобы писать код для людей, а не для машин. – Woot4Moo

0

попробовать

people.ForEach(Person person => 
    { 
     m.Bcc.Add(new MailAddress(person.EmailAddress)); 
    }); 
+0

Как это будет работать? Я не могу добавить весь объект Person к методу, ожидающему строку? – Dave

+0

Это тот же ответ, что и @Rawling уже предоставлен - поставьте Add внутри ForEach. – qujck

-1

Linq агрегат может дать хорошее решение.

 MailMessage m = new MailMessage(); 
     GetPeopleList().Aggregate((result, iter) => 
      { 
       m.Bcc.Add(new MailAddress(iter.EmailAddress)); 
       return result; 
      }); 
+0

Вы не должны использовать 'Aggregate' (или любой другой оператор LINQ, как это может сделать большинство из них) в качестве другой версии' ForEach', это противоречит их назначению. Если вы действительно должны использовать метод этой формы для замены цикла foreach, по крайней мере используйте метод 'ForEach', как это делает OP. – Servy