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;
        }

私はこれのいくつかのバージョン/バリエーションを試しましたが、明らかに何か間違ったことをしています。私はそれについてのエリック・リッパートのページを読みました、そして悲しいことにこれも助けにはなりませんでした。

4

5 に答える 5

5

次のようなものが必要です

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

で選択したアイテムの範囲を 1 つ追加するのではなく、リストにForEach1 つのアイテムForEachの人を追加しています。

そうは言っても...私は通常のforeachループの方が好きです。

于 2013-02-25T14:04:27.103 に答える
1

ブログからの直接引用:

2 番目の理由は、そうすることで言語に新たな表現力がまったく追加されないことです。これを行うと、この完全に明確なコードを書き直すことができます。

foreach(Foo foo in foos){ foo を含むステートメント; }

このコードに:

foos.ForEach((Foo foo)=>{ foo を含むステートメント; });

ほぼ同じ文字をわずかに異なる順序で使用します。しかし、2 番目のバージョンは理解しにくく、デバッグも難しく、クロージャー セマンティクスが導入されているため、オブジェクトの有効期間が微妙に変化する可能性があります。

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 に答える