【问题标题】:How do i do the following using LINQ feature of C#?如何使用 C# 的 LINQ 功能执行以下操作?
【发布时间】:2011-04-20 20:46:19
【问题描述】:

我需要帮助将以下语句转换为 lambda 语句我该怎么做?

for (int row = 0; row < rows; row++)
{
    for (int column = 0; column < columns; column++)
    {
        gList.Add(new G(this, new L(row, column), 0, 20, 30));
    }
}

感谢大家的帮助!!!

【问题讨论】:

  • 我希望 GL 可以替代真实的类名?
  • 根据您想要的外观,您可能需要编辑标题/标签以包含“LINQ”而不是“lambda”。

标签: c# linq list lambda


【解决方案1】:
var gList = Enumerable.Range(0, rows)
    .SelectMany(row =>
        Enumerable.Range(0, columns)
            .Select(column => new G(this, new L(row, column), 0, 20, 30)
        )
    ).ToList() or .ToArray();

SelectMany 将从 Select 返回的 Enumerable 展平为 IEnumerable。

【讨论】:

  • 值得一提的是,这会产生一个 IEnumerable (我相信),您可能会在其上调用 ToList() 并分配给 gList...
  • 也可以打电话给gList.AddRange,因为OP没有表明gList是一个空列表。
  • @Davy8 超出了问题的范围——我不是在为他们编码,只是为了回答这个问题。 :P
  • 虽然 OP 应该能够弄清楚这一点,但它并不是 100% 回答这个问题,因为它在所有情况下都不是功能等效的。我仍然 +1,但认为至少值得一提。
【解决方案2】:
var gList = from row in Enumerable.Range(0, rows)
            from col in Enumerable.Range(0, columns)
            select new G(this, new L(row, col), 0, 20, 30)

我最喜欢这样的内联笛卡尔

【讨论】:

  • 这是否保留与原始顺序相同的顺序? (不是说没有,我真的很好奇)
【解决方案3】:
List<G> gList = Enumerable.Range(0, rows)
    .SelectMany(row => Enumerable.Range(0, columns)
        .Select(col => new G(this, new L(row, col), 0, 20, 30)))
    .ToList();

【讨论】:

  • 我应该让自己更熟悉 SelectMany! :-)
  • 这是 Q 的正确答案。但在这种特殊情况下,我发现 LINQ 与 for(;;) 相比并没有太大的改进(可读性)。
【解决方案4】:

给我索引,将每个索引投影到新的L,将每个L 投影到新的G,并将生成的对象序列分配给名为gList 的列表。

var indexes = from row in Enumerable.Range(0, rows)
              from column in Enumerable.Range(0, columns)
              select new { Row = row, Column = column };
var ls = indexes.Select(index => new L(index.Row, index.Column));
var gs = ls.Select(l => new G(this, l, 0, 20, 30)).ToList();
var gList = gs.ToList();

请注意,如果gList 是您想要添加到的现有列表,您可以将最后一行替换为

gList.AddRange(gs);

它读起来和它正在做的完全一样。

【讨论】:

    【解决方案5】:

    正如您从其他答案中看到的那样,使用 lambda 并不总是会产生更清晰的代码。除非您在这种情况下有特定原因使用 lambda,否则我会保留 for 循环。

    可读性应该是您最关心的问题,但我想使用普通的 for 循环可能会稍微快一些,因为您没有函数调用的开销,但在大多数情况下差异并不重要。

    【讨论】:

    • 如果这个执行结构是应用程序的核心,它可能会成为使用 LINQ 方法的性能问题。我确实认为this syntax 不太容易出错
    【解决方案6】:

    将所有内容放在一个表达式中会导致糟糕的代码。为什么要这么做?以下是否有帮助:(未经测试,我想不通)

    public IEnumerable<L> GenerateLs(int rows, int columns)
    {
        for (int row = 0; row < rows; row++)
        {
            for (int column = 0; column < columns; column++)
            {
                yield return new L(row, column);
            }
        }
    }
    
    gList.Add(l => GenerateLs(rows,columns).Select(new G(this,l,0,20,30)));
    

    【讨论】:

    • +1 表示意外的混合。它不会编译(错位l =&gt; ),但它确实使用了一个lambda。我认为这可以说是最好的建议
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多