如何在使用 重构后访问在外部循环上迭代的值.选择“多”

本文关键字:选择 迭代 外部 重构 访问 循环 | 更新日期: 2023-09-27 18:31:03

我以前有一个嵌套的 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);
}

有人可以在这里帮我吗?

如何在使用 重构后访问在外部循环上迭代的值.选择“多”

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

为了访问外部迭代器,您至少可以做两件事。

通过为其提供{ }语法或使其成为完整方法,在 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 {...}语法缓存迭代器,因为嵌套 lambda 与嵌套循环具有相同的访问权限。

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