Один из вариантов, который вы можете сделать, - реализовать собственное перекрестное соединение и перечислить его.Тем не менее, это все еще не очень красиво:
actualPositions.SelectMany(actual => projections.Select(project => new { actual, project }))
Однако, если вы используете .NET 4.0 или выше, вы можете реализовать метод расширения перекрестного соединения, используя Tuples (по умолчанию) или свой собственный селектор:
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". */ });