我想使用LINQ在一行中重写以下代码。有可能吗?
var to = new MailAddressCollection();
foreach(string recipient in recipients)
{
to.Add(new MailAddress(recipient));
}
像下面这样的东西是理想的。如上所述,它返回多个MailAddressCollections:
var to = recipients.Select(r => new MailAddressCollection() {new MailAddress(r)});
请注意,这些是框架类,因此我无法重写MailAddressCollection以包含构造函数参数。
答案 0 :(得分:4)
MailAddressCollection
没有包含收件人列表的构造函数。如果您真的想在一行中完成,可以编写以下内容:
var to = recipients.Aggregate(new MailAddressCollection(),
(c, r) => { c.Add(new MailAddress(r)); return c; });
答案 1 :(得分:3)
有一个替代品不使用我为完整性提供的linq。就个人而言,由于不必要的字符串操作,我无法推荐它。
但它确实提供了简洁的解决方案。
var to = new MailAddressCollection() { string.join(",", recipients) };
答案 2 :(得分:1)
LINQ表达式将返回IEnumerable<MailAddress>
,无法直接转换为MailAddressCollection
。
替代方法是Join()地址并将结果传递给MailAddressCollection
的{{3}}方法:
var to = new MailAddressCollection();
to.Add(String.Join(",", recipients));
答案 3 :(得分:1)
您可以在IEnumerable<MailAddress>
上写一个返回MailAddressCollection
public static MailAddressCollection ToAddressCollection(this IEnumerable<MailAddress> source)
{
var to = new MailAddressCollection();
foreach(string r in source)
{
to.Add(new MailAddress(r));
}
return to;
}
然后像这样使用它:
var to = recipients.Select(r => new MailAddress(r)).ToAddressCollection();
答案 4 :(得分:-1)
这个怎么样......
var to = new MailAddressCollection(recipients.Select(r => new MailAddress(r));
尽管如此,这依赖于MailAddressCollection
(或其超类)上的构造函数的存在,它以IEnumerable<MailAddress>
为参数。如果它是List<T>
this will be the case的子类。