2017-02-17 2 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#에서 두 세계의 장점을 최대한 활용할 수있는 방법이 있습니까? 표현을 선언하고 동일한 프로젝션에서 두 번 사용하는 것과 같은 방법?

+0

필자가 예를 지나치게 단순화 한 몇 가지 대답을 본 후에 알 수 있습니다. 진짜 문제는 linq가 entite에 더 관련이 있습니다. 나는 누군가가 실제로 이것을 궁금해하고 아마도 더 좋은 질문을 올릴 경우를 대비하여 대답 중 하나를 받아 들일 것이다. – 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 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) 
    }; 
}); 

를 사용할 수있는

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

는 그냥 문 람다를 사용하지만, 당신이있는 고려한다면 나는 당신의 고양이 불쌍 :

이로 단축도 할 수 있습니다 지난 48 시간 동안 먹이를 먹었을 가능성이 있습니다!

관련 문제