2017-05-09 15 views
0

これをメソッド構文でlinq文に変換しようとしています。 foreachループがif文を持っているときに、どうすればいいのか分かりません。以下のコードでは、MyMethodToConvertは、私はこれを試してみましたDateTime.Nowif文を含むforeachループをC#のlinqメソッド構文にカバーする

foreach (var data in MyCollection) 
     { 
      if (data.DeliveryDate.Equals("Tomorrow")) 
      { 
       data.DeliveryDate = MyMethodToConvert(DeliveryDate); 
      } 
     } 

に文字列「明日」を置き換え、tは

MyCollection = MyCollection.Select(a => 
       { 
        a.DeliveryDate.Equals("Tomorrow") 
         ? MyMethodToConvert(DeliveryDate) 
         : a.DeliveryDate) 
        ; 
        return a; 
     }).ToList(); 

を動作しませんでした。しかし、それは動作しませんでした。

+4

LINQは、コードを簡潔かつ明確にする場合に最適です。何が起こっているのかを隠しているとき、LINQは素晴らしいことではありません。あなたの「foreach」は、目的と結果に関して明確です。それを変更しないでください。 – crashmstr

答えて

4

行くまでのところこれだけ:

foreach (var data in MyCollection.Where(x => x.DeliveryDate.Equals("Tomorrow"))) 
{ 
    data.DeliveryDate = MyMethodToConvert(DeliveryDate); 
} 

x.DeliveryDateコンパイル時タイプがstringある場合は、好む:

MyCollection.Where(d => d.DeliveryDate.Equals("Tomorrow")) 
      .ToList() 
      .ForEach(d => d.DeliveryDate = MyMethodToConvert(DeliveryDate)); 
+2

これは良い方法です。コンパクトなフォームを提供しながら可読性を維持する。 :) – elgonzo

-1

方法をこれを使用できます:

あなたのコード内の任意のセミコロンをしたくない場合は
MyCollection = MyCollection.Select(data => 
{ 
    if (data.DeliveryDate.Equals("Tomorrow")) 
     data.DeliveryDate = MyMethodToConvert(DeliveryDate); 
    return data; 
}).ToList(); 

それとも、(私はあなただけDeliveryDateのコンストラクタと配達という名前のクラスを持っていると仮定します):

MyCollection = MyCollection.Select(data => data.DeliveryDate.Equals("Tomorrow") 
    ? new Delivery(MyMethodToConvert(DeliveryDate)) 
    : data).ToList(); 

しかし、ここではLinqを使用することはお勧めしません。 Linqの有用な使用方法は、Jeppe Stig Nielsenが提案したものだけです。

0

あなた:これについて

foreach (var data in MyCollection.Where(x => x.DeliveryDate == "Tomorrow")) 
{ 
    data.DeliveryDate = MyMethodToConvert(DeliveryDate); 
}