如何使用C#的LINQ功能执行以下操作?

时间:2011-04-20 20:46:20

标签: c# linq list lambda

我需要帮助以下语句转换为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));
    }
}

感谢所有的帮助!!!

6 个答案:

答案 0 :(得分:2)

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。

答案 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)

我喜欢这样的内联笛卡儿

答案 2 :(得分:1)

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

答案 3 :(得分:1)

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

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

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

答案 4 :(得分:1)

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

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

答案 5 :(得分:0)

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

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