在使用.SelectMany进行重构之后,如何在外循环上访问迭代值

时间:2014-11-18 19:20:52

标签: c# linq

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

有人可以帮助我吗?

2 个答案:

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