2017-02-17 7 views
0

ですから、例えばプログラム:式に依存するlinq投影の繰り返しを避ける方法はありますか?

class Cat 
    { 
     public bool IsMale { get; set;} 
     public int TailLength { get; set; } 
     public string Name { get; set; } 
     public decimal ClawAttackFrequency { get; set; } 
     public List<DateTime> FeedingTimes { get; set; } 
    } 


    static void Main(string[] args) 
    { 
     var cats = new List<Cat>(); 
     var someData = cats 
      .Select(x => new 
      { 
       x.Name, 
       x.IsMale, 
       LatestFeedingTime = x.FeedingTimes.Max(y => (DateTime?)y) 
      }) 
      .Select(x => new 
      { 
       x.Name, 
       x.IsMale, 
       x.LatestFeedingTime, 
       WasFedRecently = x.LatestFeedingTime.HasValue && x.LatestFeedingTime.Value >= DateTime.Today.AddDays(-1) 
      }); 
    } 

これは何もしませんが、それはLatestFeedingTimeための表現を複製することを避けるために、私が代わりに二つの突起を作成し、複製しなければならないことである私の問題を説明するだけのおもちゃのプログラムであり、プロパティの束。

var someData = cats 
     .Select(x => new 
     { 
      x.Name, 
      x.IsMale, 
      LatestFeedingTime = x.FeedingTimes.Max(y => (DateTime?)y), 
      WasFedRecently = (x.FeedingTimes.Max(y => (DateTime?)y)).HasValue && (x.FeedingTimes.Max(y => (DateTime?)y)).Value >= DateTime.Today.AddDays(-1) 
     }); 

しかし、これではなく、トリッキーな表現を複製:

代替がされていると思います。

C#で両方の世界を最大限に活用する方法はありますか?式を宣言してから同じ投影法で2回使用するようにしますか?

+0

私は私の例をあまり単純化したいくつかの答えの後に見る。本当の問題はlinqがentiteに関連しています。誰かが実際にこれを疑問に思って、より良い質問を投稿する場合には、回答の1つを受け入れます。 – alun

答えて

1

私がやって見ますそれはこの方法です:

var someData = 
    from x in cats 
    let LatestFeedingTime = x.FeedingTimes.Max(y => (DateTime?)y) 
    select new 
    { 
     x.Name, 
     x.IsMale, 
     LatestFeedingTime, 
     WasFedRecently = 
      LatestFeedingTime.HasValue 
      && LatestFeedingTime.Value >= DateTime.Today.AddDays(-1) 
    }; 

これは確かにコードの重複を排除しますが、フードの下では同じコードを生成しています。

あなたも、このにそれを短縮することができます。

var someData = 
    from x in cats 
    let LatestFeedingTime = x.FeedingTimes.Max(y => (DateTime?)y) 
    select new 
    { 
     x.Name, 
     x.IsMale, 
     LatestFeedingTime, 
     WasFedRecently = LatestFeedingTime >= DateTime.Today.AddDays(-1) 
    } 
0

あなたは、単にあなたが望むものを返すビルド方法を定義することができ

var someData = cats 
     .Select (Cat.BuildData); 

そして、あなたの

public static Something BuildData (Cat cat) { 

は、あなたが任意のローカル変数を使用することができます内側

...

0

はちょうどあなたが

var someCats = cats.Select(x => 
{ 
    var lft = x.FeedingTimes.Max(y => (DateTime?)y); 
    return new 
    { 
     x.Name, 
     x.IsMale, 
     LatestFeedingTime = lft, 
     WasFedRecently = lft >= DateTime.Today.AddDays(-1) 
    }; 
}); 

ローカル変数を使用することができますステートメントラムダを使用しかし、あなたはそれがあることを検討している場合、私はあなたの猫のために気の毒に思います最後の48時間で潜在的に摂食されているとして最近給餌された!

関連する問題