【问题标题】:How can I use Linq instead of foreach to get items out of a nested set?如何使用 Linq 而不是 foreach 从嵌套集中获取项目?
【发布时间】:2012-07-04 08:41:05
【问题描述】:

我有多个嵌套的 foreach 循环进行一些处理,如何将此表达式转换为 Linq?

slug.Text = "";
foreach (var script in slugItem.script) {
 foreach (var body in script.body) {
  foreach (var vo in body.vo) {
   foreach (var content in vo.content) {
    foreach (var text in content.text) {
     slug.Text = string.Format("{0}\n{1}", slug.Text, text.Value);
    } } } } }

【问题讨论】:

  • 出于好奇...为什么?除了嵌套循环的数量之外,这段代码有什么本质上的问题?从更“干净的代码”的角度来看,我可能会用嵌套的函数调用替换这些循环,这样顶级代码只需要调用一个函数。但除此之外,这是非常清晰易读的。
  • @AakashM 但它在每次重新分配中使用slug.Text...
  • string.format 使用之前的slug.Text 值,因此所有循环迭代对于最终结果都很重要
  • @MarcinJuraszek,显然我错过了我的第一个(现已删除)答案。

标签: linq foreach


【解决方案1】:
slug.Text = string.Join("\n", slugItem.script.SelectMany(i=>i.body)
                                             .SelectMany(i=>i.vo)
                                             .SelectMany(i=>i.content)
                                             .SelectMany(i=>i.text)
                                             .SelectMany(i=>i.Value));

【讨论】:

  • 这绝对符合问题的规定要求。但在更实际的层面上,我不建议在原始代码上使用此代码。 .SelectMany 不像 foreach 那样一目了然,而且在阅读这段代码时需要一两分钟的时间来理解它。
  • 我同意 :) 但问题是这样的
  • 确实,这不是 Stack Overflow 上用户第一次想要过度设计并且通常会做他们不应该做的事情:)
  • 我相信 linq 结果的顺序是不确定的,除非说明了顺序。在实践中,这可能会产生与 OP 代码相同的结果。
【解决方案2】:

为什么要使用 Linq,它会添加什么?但是我会使用StringBuilder

var slugtext = new StringBuilder();

foreach (var script in slugItem.script) 
{   
    foreach (var body in script.body) 
    {    
        foreach (var vo in body.vo) 
        {     
            foreach (var content in vo.content)
            {      
                foreach (var text in content.text)
                {       
                    slugText.AppendLine(text.Value);
                }
            }
        }
    }
}

 slug.Text = slugText.ToString();

【讨论】:

  • 虽然我认为它提供了更好的输出,但它提供的输出与原始输出不同。
猜你喜欢
  • 1970-01-01
  • 2021-08-20
  • 2016-07-03
  • 2013-09-24
  • 2018-02-17
  • 2014-10-23
  • 1970-01-01
  • 2016-05-16
  • 1970-01-01
相关资源
最近更新 更多