我可以使用带有LINQ的集合初始化程序来返回完全填充的集合吗?

时间:2011-06-02 08:58:18

标签: c# linq

我想使用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以包含构造函数参数。

5 个答案:

答案 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的子类。