【问题标题】:c# Static Member inside ForEachc# ForEach 中的静态成员
【发布时间】:2015-07-23 07:38:58
【问题描述】:

我有以下几点:

blocks.Where(x => x.BlockName == NAVIGATION)
      .ForEach(block => block.Data = db.Pages.Select(x => x.Name).ToList());

如果where 找到多个块,我如何防止db.Pages.Select 对每个块执行数据库命中,而只需将List 重复用于第二个和后续块。

你可以在 lambda 函数中包含静态变量吗?

更新:如果where 发现零块,我根本不想执行提取。

更新:blocks 是一个内存列表

【问题讨论】:

  • blocks 是从数据库加载的实体吗?无论如何,为什么不在开头写var names = db.Pages.Select(x => x.Name).ToList();,将其存储在变量中,然后在ForEach中使用变量?
  • 当然,你可以在(var data = db.Pages.Select(x => x.Name).ToList())之前定义数据列表,然后在lambda里面使用:... .ForEach(block => block.Data = data);
  • 之前获取数据的问题是,如果where 发现零块,我根本不希望进行获取。
  • 试试这个,然后:IEnumerable<string> data = null; foreach (var block in blocks.where(...) { block.Data = data ?? (data = db.pages.select(x => x.name)); }
  • var navigationBlocks = blocks.Where(x => x.BlockName == NAVIGATION).ToList(); if (navigationBlocks.Any()) { var data = db.Pages.Select(x => x.Name).ToList(); \\ and work with it }

标签: c# foreach lambda static


【解决方案1】:
var blocksResult = blocks.Where(x => x.BlockName == NAVIGATION);
if (blocksResult.Any())
{
    var blockData = db.Pages.Select(x => x.Name).ToList();
    blocksResult.ForEach(block => block.Data = blockData);
}

List<string> blockData = null;
blocks.Where(x => x.BlockName == NAVIGATION).ForEach(block => block.Data = (blockData ?? (blockData  = db.Pages.Select(x => x.Name).ToList())))

【讨论】:

  • 谢谢。在这两种情况下,Where 返回一个 IEnumerable,而不是 List,因此没有 ForEach。但是添加 ToList 会对此进行排序。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多