我怎样才能以一种更具可读性的方式来做这件事呢?
foreach (var actual in actualPositions)
{
foreach (var projection in projections)
{
var position = Create(book, actual, projection);
position.TargetNett = projection.DailyProjectedNet.ToString();
yield return position;
}
}
发布于 2012-03-09 00:48:56
你想简化一下吗?为什么?它是简单的,可读的和理解的。你可以想出各种难以阅读但看起来更酷的官样文章。不要这样!克制住花哨的冲动。
发布于 2012-03-09 00:58:19
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;
}
发布于 2012-03-09 01:03:16
你可以做的一种选择是实现你自己的交叉连接,并在上面进行枚举。然而,它仍然不是很漂亮:
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". */ });
https://stackoverflow.com/questions/9621345
复制相似问题