2013-02-25 65 views
1

我试图将多个字符串添加到C#中的MailAddress。ForEach和foreach

如果我用ForEach,我的代码看起来像

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

现在我想用我的foreach(即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 2013-02-25 14:03:47

+1

你的问题是错误的方式。你写过:“如果我使用ForEach”,然后使用'foreach' ... – 2013-02-25 14:03:50

+0

我希望你不是这样做,而不仅仅是学习练习。 'List.ForEach()'不应该像你试图使用它的方式那样使用,你已经拥有的版本更清晰。 – JLRishe 2013-02-25 14:08:28

回答

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 2013-02-25 14:06:26

1

直接报价:

第二个原因是,这样做增加了新的零代表性 电源语言。这样做可以让你完全重写这个 清除代码:

foreach(Foo foo in foos){涉及foo的语句; }

到这个代码:

foos.ForEach((美孚FOO)=> {声明涉及FOO;});

它使用几乎完全相同的字符略有不同 顺序。然而第二个版本更难理解,难以调试,并且引入了闭包语义,从而潜在地以微妙的方式改变了对象的生命周期。

Eric Lippert明确地呼吁不要这样做。

+0

谢谢你。是的,我已经阅读过这篇文章,但作为练习的一部分,我想用它来体验它。谢谢你,很重要的一点。 – Dave 2013-02-25 14:06:12

+0

@Woot问题纯粹是语法问题,而不是“请告诉我不要使用这种语言功能,我试图弄清楚如何使用”。 – Rawling 2013-02-25 14:06:39

+0

@DaveRook可以理解。但是,请始终记住为人类而不是机器编写代码。 – Woot4Moo 2013-02-25 14:06:58

0

尝试

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

这项工作将如何进行?我无法将整个Person对象添加到期望字符串的方法中? – Dave 2013-02-25 14:07:44

+0

这与@Rawling已经给出的答案是一样的 - 将Add添加到ForEach中。 – qujck 2013-02-25 14:10:06

-1

Linq的总能给一个好的解决方案。

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

您不应该使用'Aggregate'(或任何其他LINQ操作符,因为大多数技术上可以这样做)作为另一个版本的'ForEach',这与它们的目的相反。如果你真的必须使用这种形式的方法来替换'foreach'循环,至少应该像OP那样使用'ForEach'方法。 – Servy 2013-02-25 14:56:43