2016-08-10 8 views
0

emailAddressesは文字列のリストです。 notificationRequestは、クラスRequestXml(タイプはXDocument)です。私はSUBMITTERALIAS内のすべてのメールアドレスが文字列リストに保存する取得したい複数のforeach反復を単一のLINQに変更するにはどうすればよいですか?

<root> 
    <result> 
     <SUBMITTERALIAS>[email protected]</SUBMITTERALIAS> 
    </result> 
    <result> 
     <SUBMITTERALIAS>[email protected]</SUBMITTERALIAS> 
    </result> 
</root> 

RequestXmlは次のようになります。だから私は次のコードを書いた。私は仕事をして仕事をしています。

var emailAddresses = new List<string>(); 

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

上記のforeachの代わりに1行のLINQコードを使用したいと思います。何か案は?

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

そして、あなたが実際にリストすることを必要としない場合:

var emailAddressList = emailAddresses.ToList(); 

OOのアプローチあなたはちょうどそれが電子メールアドレスのシーケンスを返すようにクエリを平らにする必要が

+0

emailAdressesは= .ToList() – kassi

答えて

2

をあなたは、単にそのようにそれを呼び出すことができますリスト:

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

requestEmailAddresses()メソッドを作成することがあります

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

そして、それを使用してクエリを変更する:あなたは完全に新しいを作成した場合

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

:あなたはAddRangeSelectManyでリストを平らにして使用することができます別のリストにアドレスを追加したい場合は

var emailAddresses = notificationRequest.SelectMany(x => x.EmailAddresses()); 
0
request.RequestXml.Descendants("SUBMITTERALIAS").ToList().ForEach(x => emailAddresses.Add(x.Value)); 
+0

(req.RequestXML.DescendantsでメールからnotificationrequestでREQ( "SUBMITTERALIAS")を選択email.valueから)これは 'foreach'ネストを低下させません。そして、 'ForEach'はlinqではなく' List 'のインスタンスメソッドです。 –

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

@HenkHolterman私はそれができるとは思わない。 'notificationRequest'は' request'オブジェクトの束を含んでいます。投影された「IEnumerable 」は平坦化する必要があります。 –

関連する問題