我如何使用c#的LINQ特性来做下面的事情?

本文关键字:何使用 LINQ | 更新日期: 2023-09-27 17:50:37

我需要帮助以下语句转换为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));
    }
}
感谢所有的帮助!!

我如何使用c#的LINQ特性来做下面的事情?

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

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)

我最喜欢的内联笛卡尔

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();

给我索引,将每个索引投影到一个新的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);

从其他答案中可以看出,使用lambda并不总是产生更干净的代码。除非你有特殊的理由在这种情况下使用lambdas,否则我将保留for循环。

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

将所有内容放在一个表达式中会导致可怕的代码。你为什么要这么做?(未经测试,out of my head)

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)));