2013-02-25 66 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