首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用LINQ简化2个foreach?

如何使用LINQ简化2个foreach?
EN

Stack Overflow用户
提问于 2012-03-09 00:41:09
回答 5查看 505关注 0票数 0

我怎样才能以一种更具可读性的方式来做这件事呢?

代码语言:javascript
运行
复制
 foreach (var actual in actualPositions)
 {
     foreach (var projection in projections)
     {
         var position        = Create(book, actual, projection);
         position.TargetNett = projection.DailyProjectedNet.ToString();
         yield return position;
     }
 }
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-03-09 00:48:56

你想简化一下吗?为什么?它是简单的,可读的和理解的。你可以想出各种难以阅读但看起来更酷的官样文章。不要这样!克制住花哨的冲动。

票数 12
EN

Stack Overflow用户

发布于 2012-03-09 00:58:19

代码语言:javascript
运行
复制
return 
  from actual in actualProjections
  from projection in projections
  select Create(book, actual, projection)
          .With_TargetNett(projection.DailyProjectedNet.ToString());

其中With_TargetNett是扩展

代码语言:javascript
运行
复制
static Position With_TargetNett(this Position position, string targetNett)
{
 position.TargetNett = targetNett;
 return position;
}
票数 2
EN

Stack Overflow用户

发布于 2012-03-09 01:03:16

你可以做的一种选择是实现你自己的交叉连接,并在上面进行枚举。然而,它仍然不是很漂亮:

代码语言:javascript
运行
复制
actualPositions.SelectMany(actual => projections.Select(project => new { actual, project }))

但是,如果您使用的是.NET 4.0或更高版本,则可以使用元组(默认)或您自己的自定义选择器实现交叉联接扩展方法:

代码语言:javascript
运行
复制
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)));
}

这样使用起来就容易多了:

代码语言:javascript
运行
复制
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". */ });
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9621345

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档