代码之家  ›  专栏  ›  技术社区  ›  good-to-know

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

  •  0
  • good-to-know  · 技术社区  · 8 年前

    emailAddresses 是字符串列表。 notificationRequest 这个类有字段吗 RequestXml (类型为 XDocument ).

    将是这样的:

    <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);
        }
    }
    

    4 回复  |  直到 8 年前
        1
  •  2
  •   René Vogt    8 年前

    如果要将地址添加到另一个列表中,可以使用 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();
    
        2
  •  2
  •   Tolga Evcimen    8 年前

    这应该可以做到:

    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();
    
        3
  •  0
  •   Alex David    8 年前
    request.RequestXml.Descendants("SUBMITTERALIAS").ToList().ForEach(x => emailAddresses.Add(x.Value));
    
        4
  •  0
  •   Charles Mager    8 年前

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

    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());