如何将多个foreach迭代更改为单个LINQ?

时间:2016-08-10 12:41:37

标签: c# linq

emailAddresses是字符串列表。 notificationRequest该类的字段为RequestXml(类型为XDocument)。

RequestXml就像:

<root>
    <result>
        <SUBMITTERALIAS>example@domain.com</SUBMITTERALIAS>
    </result>
    <result>
        <SUBMITTERALIAS>example@domain.com</SUBMITTERALIAS>
    </result>
</root>

我希望将SUBMITTERALIAS中的所有电子邮件地址保存在字符串列表中。所以我写了下面这段代码。我做了工作并完成了工作。

var emailAddresses = new List<string>();

foreach (var request in notificationRequest)
{
    foreach (var email in request.RequestXml.Descendants("SUBMITTERALIAS"))
    {
        emailAddresses.Add(email.Value);
    }
}

我想使用单行LINQ代码而不是foreach。有什么想法吗?

4 个答案:

答案 0 :(得分:2)

如果您要将地址添加到其他列表,可以使用SelectMany展开列表并使用AddRange

emailAddresses.AddRange(notificationRequest.SelectMany(request =>
                  request.RequestXml.Descendants("SUBMITTERALIAS"))
                  .Select(email => email.Value));

如果您创建一个完整的新列表,您可以简单地调用它:

emailAddresses = notificationRequest.SelectMany(request =>
                  request.RequestXml.Descendants("SUBMITTERALIAS"))
                  .Select(email => email.Value).ToList();

答案 1 :(得分:2)

这应该这样做:

var emailAddresses = notificationRequest.
    /// flatten the list of descendats list to email list
    SelectMany(request => request.RequestXml.Descendants("SUBMITTERALIAS")).
    /// select the value of the email element
    Select(email => email.Value).
    /// convert it to a List
    ToList();

答案 2 :(得分:0)

您需要展平查询,以便只返回一系列电子邮件地址:

var emailAddresses = 
    from request in notificationRequest
    from email in request.RequestXml.Descendants("SUBMITTERALIAS")
    select email.Value;

如果你确实需要它作为一个列表:

var emailAddressList = emailAddresses.ToList();

OO方法可能是在EmailAddresses()中创建request方法:

public IEnumerable<string> EmailAddresses()
    => RequestXml.Descendants("SUBMITTERALIAS").Select(x => x.Value);

并更改您的查询以使用:

var emailAddresses = notificationRequest.SelectMany(x => x.EmailAddresses());

答案 3 :(得分:0)

request.RequestXml.Descendants("SUBMITTERALIAS").ToList().ForEach(x => emailAddresses.Add(x.Value));
相关问题