2012-03-08 2 views

답변

12

단순화 하시겠습니까? 왜? 간단하고 읽기 쉽고 이해하기 쉽습니다. 너는 더 열심히 인 읽는 그러나 확실하게 더 차갑게 보는 모든 온갖 난투침을 생각해 낼 수있다. 하지 마라! 공상에 빠지라고 충동을 거부하십시오. With_TargetNett가 확장에게 있습니다

+0

이것은. 또한 시간을 낭비하지 말고 시간을 "최적화"하는 시간을 낭비하지 마십시오. 아마도 LINQ 문을 만들기 위해 더 많은 시간을 보냈을 것입니다. 무슨 이득? – Fourth

+0

이것이 내가 권하는 것입니다. 여기에서하는 일을 이해하는 것이 더 쉽습니다. 아래에서 내 대답이 반드시 그럴 필요는 없습니다 (최소한 첫 번째 버전의 경우). 때로는 더 많은 코드가 가독성과 향후 유지 관리를 위해 더 나은 경우도 있습니다. – SPFiredrake

2
return 
    from actual in actualProjections 
    from projection in projections 
    select Create(book, actual, projection) 
      .With_TargetNett(projection.DailyProjectedNet.ToString()); 

은 당신이 할 수있는

static Position With_TargetNett(this Position position, string targetNett) 
{ 
position.TargetNett = targetNett; 
return position; 
} 
+1

그가 원했던 것이지만, 그가 원래 썼던 것이 5 줄을 차지하고, 이것이 5 + 3을 차지하는 것을 확인하십시오. 어쨌든, 그것을 생각하는 시간을 가지기 위해서 +1. –

2

하나의 옵션은 자신의 크로스 조인을 구현하고, 그 이상 열거하는 것입니다. 그러나, 그것은 아주 예쁜 아직 아니다 :

actualPositions.SelectMany(actual => projections.Select(project => new { actual, project })) 

그러나, 당신은 .NET 4.0 이상을 사용하는 경우, 당신은 십자가 튜플 (기본값) 또는 사용자 정의 선택기를 사용하여 확장 메서드에 가입 구현할 수 있습니다

다음
public static IEnumerable<Tuple<T1, T2>> CrossJoin<T1, T2>(this IEnumerable<T1> source, IEnumerable<T2> toJoin) 
{ 
    return source.CrossJoin(toJoin, Tuple.Create<T1, T2>); 
} 

public static IEnumerable<T3> CrossJoin<T1, T2, T3>(this IEnumerable<T1> source, IEnumerable<T2> toJoin, Func<T1, T2, T3> selector) 
{ 
    return source.SelectMany(tFirst => toJoin.Select(tSecond => selector(tFirst, tSecond))); 
} 

그리고 이것은 훨씬 더 쉽게 사용할 수 있습니다

foreach(var pair in actualPositions.CrossJoin(projections)) 
{ 
    var position = Create(book, pair.Item1, pair.Item2); 
    position.TargetNett = pair.Item2.DailyProjectedNet.ToString(); 
    yield return position; 
} 
// OR 
return actionPositions.CrossJoin(projections, (actual, project) => { /*Code in foreach loop above here, without the "yield". */ }); 
0

단지

return 
(
    from actual in actualProjections 
    from projection in projections 
    select new {actual, projection} 
).Select(pair => 
    { 
    var position = Create(book, pair.actual, pair.projection); 
    position.TargetNett = pair.projection.DailyProjectedNet.ToString();   
    return position; 
    } 
); 
재미

에 대한
0

이 경우 Linq는 가독성이 떨어집니다. 당신은 별도의 방법으로 두 번째 foreach 문을 이동 한 후 사용할 수 있습니다 Linq에는

return from actual in actualPositions 
     select GetBookPositionList(actual); 

새로운 방법 :

private List<BookPosition> GetBookPositionList(ActualPosition actual) 
{ 
    foreach (var projection in projections) 
    { 
    var position = Create(book, actual, projection); 
    position.TargetNett = projection.DailyProjectedNet.ToString(); 
    yield return position; 
    } 
} 
관련 문제