是否可以将集合初始值设定项与 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 以包含构造函数参数。

是否可以将集合初始值设定项与 LINQ 一起使用以返回完全填充的集合

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>的子类,情况就是这样。