1

我正在尝试将多个字符串添加到 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 的页面,遗憾的是这也没有帮助。

4

5 回答 5

5

你需要类似的东西

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

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

也就是说......我自己更喜欢常规foreach循环。

于 2013-02-25T14:04:27.103 回答
1

直接引用博客:

第二个原因是这样做会给语言增加零新的表示能力。这样做可以让你重写这个非常清晰的代码:

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

进入这段代码:

foos.ForEach((Foo foo)=>{ 涉及 foo 的语句; });

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

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

于 2013-02-25T14:05:17.523 回答
0

尝试

people.ForEach(Person person =>
    {
        m.Bcc.Add(new MailAddress(person.EmailAddress));
    });
于 2013-02-25T14:07:04.800 回答
-1

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

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

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

于 2013-02-25T14:04:12.953 回答
-1

Linq 聚合可以给出一个很好的解决方案。

        MailMessage m = new MailMessage();
        GetPeopleList().Aggregate((result, iter) =>
            {
                m.Bcc.Add(new MailAddress(iter.EmailAddress));
                return result;
            });
于 2013-02-25T14:52:28.523 回答