我以前有一个嵌套的for循环,如下所示:
for(int i = 0; i < outerObject.Count(); i++)
{
for(int j = 0; j < outerObject[i].innerObject.Count(); j++)
{
DataRow myDataRow = myDataTable.NewRow();
myDataRow["Column1"] = outerObject[i].PropertyX;
myDataRow["Column2"] = innerObject[j].PropertyY;
myDataTable.Rows.Add(myDataRow);
}
}
我使用LINQ SelectMany
运算符重构了上述内容,但我不确定如何使用outerObject[i].PropertyX
var objects = outerObject.SelectMany(x => x.innerObject)
foreach (var object in objects)
{
DataRow myDataRow = myDataTable.NewRow();
//myDataRow["Column1"] = // I am unsure how to get the value of outerObject[i].PropertyX here
myDataRow["Column2"] = object.PropertyY;
myDataTable.Rows.Add(myDataRow);
}
有人可以帮助我吗?
答案 0 :(得分:3)
var objects = outerObject.SelectMany(x => new { outer = x, inner = x.innerObject })
foreach (var obj in objects)
{
DataRow myDataRow = myDataTable.NewRow();
myDataRow["Column1"] = obj.outer.PropertyX;
myDataRow["Column2"] = obj.inner.PropertyY;
myDataTable.Rows.Add(myDataRow);
}
答案 1 :(得分:1)
为了访问外部迭代器,你至少可以做两件事。
通过赋予{ }
语法或使其成为完整方法,在lambda中执行循环逻辑
var objects = outerObject.SelectMany(x =>
{
var result = x.InnerObject;
DataRow myDataRow = myDataTable.NewRow();
myDataRow["Column1"] = x.PropertyX;
myDataRow["Column2"] = result.PropertyY;
myDataTable.Rows.Add(myDataRow);
return result;
}
使用new {...}
语法缓存迭代器,因为嵌套的lambdas与嵌套循环具有相同的访问权限。
var objects = outerObject.SelectMany(x => x.InnerObject
.Select(inner => new { Outer = x, Inner = inner } ));
foreach (var obj in objects)
{
DataRow myDataRow = myDataTable.NewRow();
myDataRow["Column1"] = obj.Outer.PropertyX;
myDataRow["Column2"] = obj.Inner.PropertyY;
myDataTable.Rows.Add(myDataRow);
}