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