c#如何访问后重构与迭代外环路上的值。SelectMany

标签: Linq C#
发布时间: 2017/2/28 22:35:30
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

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

有人能帮我一下吗?

解决方法 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 {...} 语法,因为嵌套的 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);
}
赞助商