是否可以将集合初始值设定项与 LINQ 一起使用以返回完全填充的集合
本文关键字:集合 一起 返回 填充 LINQ 是否 | 更新日期: 2023-09-27 17:58:24
我想使用 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 以包含构造函数参数。
MailAddressCollection
没有接受收件人列表的构造函数。如果你真的想在一行中做到这一点,你可以写以下内容:
var to = recipients.Aggregate(new MailAddressCollection(),
(c, r) => { c.Add(new MailAddress(r)); return c; });
有一个 1 行的替代项不使用 linq,我提供了它来保证完整性。就个人而言,由于不必要的字符串操作,我不能推荐它。
但是,它确实提供了一个简洁的解决方案。
var to = new MailAddressCollection() { string.join(",", recipients) };
您可以在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();
LINQ 表达式会返回一个 IEnumerable<MailAddress>
,不能直接转换为 MailAddressCollection
。
另一种方法是 Join(( 地址并将结果传递给MailAddressCollection
的 Add(( 方法:
var to = new MailAddressCollection();
to.Add(String.Join(",", recipients));
这个怎么样...
var to = new MailAddressCollection(recipients.Select(r => new MailAddress(r));
虽然,这依赖于MailAddressCollection
(或其超类(上构造函数的存在,该构造函数将IEnumerable<MailAddress>
作为参数。如果它是List<T>
的子类,情况就是这样。