我正在尝试在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关于它,遗憾的是这也无济于事。
答案 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;
});