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