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。有什么想法吗?
答案 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));