ForEach和foreach

时间:2013-02-25 14:01:18

标签: c# foreach

我正在尝试在C#中向MailAddress添加多个字符串。

如果我使用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", "Joe.Bloggs@foo.bar"));
            peopleList.Add(new Person("John", "Smith", "John.Smith@foo.bar"));
            peopleList.Add(new Person("Ann", "Other", "Ann.Other@foo.bar"));
            return peopleList;
        }

我已经尝试了几种版本/变体,但我显然做错了。我读了Eric Lippert's page关于它,遗憾的是这也无济于事。

5 个答案:

答案 0 :(得分:5)

你需要像

这样的东西
people.ForEach(Person p => {
    m.Bcc.Add(new MailAddress(p.EmailAddress));
});

您可以在列表中添加单个项目ForEach,而不是添加使用ForEach选择的单个项目范围。

那就是说......我更喜欢常规的foreach循环。

答案 1 :(得分:1)

博客直接引用:

  

第二个原因是,这样做会增加零代表性   语言的力量。这样做可以让你完美地重写它   明确的代码:

     

foreach(foo foo in foos){声明涉及foo; }

     

进入此代码:

     

foos.ForEach((Foo foo)=&gt; {声明涉及foo;});

     

使用几乎完全相同的字符略有不同   订购。然而第二个版本更难理解,更难   调试,并引入闭包语义,从而可能发生变化   以微妙的方式反对生命。

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

答案 2 :(得分:0)

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

答案 3 :(得分:-1)

我不知道我是否理解正确,但请尝试:

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

您在代码中创建了一个新的电子邮件地址,但这不是必需的,因为您已经从item收到了一封电子邮件地址。

答案 4 :(得分:-1)

Linq聚合可以提供一个很好的解决方案。

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