2012-03-08 13 views

答えて

12

簡略化したいですか?どうして?シンプルでわかりやすく理解できます。あなたはより硬いであるが、確かによりクールに見えるすべての種類のゴブリンジグックを考え出すことができる。しない!思い切った衝動に抵抗してください。

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

With_TargetNettが拡張子ですあなたが行うことができます

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

これは彼が望んでいるものですが、彼が元々書いたものが5行を取り、これは5 + 3を要することに注意してください。とにかく、思考の時間をとるため+1。 –

2

1つのオプションは、あなた自身のクロス結合を実装し、その上で列挙することです。しかし、それは非常にきれいまだありません。

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; 
    } 
} 
関連する問題