C# 方法链中的Linq中间对象的位置和选择?

C# 方法链中的Linq中间对象的位置和选择?,c#,linq,linq-to-objects,C#,Linq,Linq To Objects,我正在处理DocumentFormat.xml 我需要做一些工作来获取where子句所需的数据 但是我需要在where子句中做同样的工作来构造所需的对象 这似乎是浪费 有没有更好的方法来构建它 var rowData = registersRows .Where(row => { var cells = row.Elements<Cell>().ToList(); return included.Contains(GetCellT

我正在处理DocumentFormat.xml

我需要做一些工作来获取where子句所需的数据

但是我需要在where子句中做同样的工作来构造所需的对象

这似乎是浪费

有没有更好的方法来构建它

var rowData = registersRows
    .Where(row =>
    {
        var cells = row.Elements<Cell>().ToList();
        return included.Contains(GetCellText(cells, "A", row.RowIndex, sharedStringTableItems));
    })
    .Select(row =>
    {
        var cells = row.Elements<Cell>().ToList();
        return new RegistersRow
        {
            StoreNumber = GetCellText(cells, "A", row.RowIndex, sharedStringTableItems),
            ChannelName = GetCellText(cells, "D", row.RowIndex, sharedStringTableItems),
            ChannelDisplayName = GetCellText(cells, "E", row.RowIndex, sharedStringTableItems),
            PhysicalDeviceName = GetCellText(cells, "F", row.RowIndex, sharedStringTableItems),
            FriendlyName = GetCellText(cells, "G", row.RowIndex, sharedStringTableItems),
            DisplayNameInLabel = GetCellText(cells, "H", row.RowIndex, sharedStringTableItems),
            NumberOfRegisters =
                int.Parse(GetCellText(cells, "K", row.RowIndex, sharedStringTableItems))
        };
    }).ToList();
var rowData=registersRows
。其中(行=>
{
var cells=row.Elements().ToList();
return included.Contains(GetCellText(单元格,“A”、row.RowIndex、sharedStringTableItems));
})
.选择(行=>
{
var cells=row.Elements().ToList();
返回新注册表行
{
StoreNumber=GetCellText(单元格“A”、row.RowIndex、sharedStringTableItems),
ChannelName=GetCellText(单元格“D”、行.RowIndex、sharedStringTableItems),
ChannelDisplayName=GetCellText(单元格“E”、row.RowIndex、sharedStringTableItems),
PhysicalDeviceName=GetCellText(单元格“F”、行.RowIndex、sharedStringTableItems),
FriendlyName=GetCellText(单元格,“G”、row.RowIndex、sharedStringTableItems),
DisplayNameInLabel=GetCellText(单元格,“H”,行.RowIndex,sharedStringTableItems),
寄存器数=
int.Parse(GetCellText(单元格,“K”,行.RowIndex,sharedStringTableItems))
};
}).ToList();

具体来说,在本例中,我需要提取StoreNumber并获取两次单元格。

如果使用LINQ和查询语法,则有
let
关键字,该关键字创建了一个临时值,以便稍后在查询中使用。当编译器将查询语法转换为fluent/lambda语法时,
let
将转换为一个
Select
,它将临时值与需要携带到未来方法中的任何值捆绑在一起

您可以手动执行相同的操作:

var rowData = registersRows
    .Select(r => new { RowIndex = r.RowIndex, cells = r.Elements<Cell>().ToList() })
    .Select(rc => new { rc.RowIndex, rc.cells, A = GetCellText(rc.cells, "A", rc.RowIndex, sharedStringTableItems) })
    .Where(rca => included.Contains(rca.A))
    .Select(rca => new RegistersRow {
        StoreNumber = rca.A,
        ChannelName = GetCellText(rca.cells, "D", rca.RowIndex, sharedStringTableItems),
        ChannelDisplayName = GetCellText(rca.cells, "E", rca.RowIndex, sharedStringTableItems),
        PhysicalDeviceName = GetCellText(rca.cells, "F", rca.RowIndex, sharedStringTableItems),
        FriendlyName = GetCellText(rca.cells, "G", rca.RowIndex, sharedStringTableItems),
        DisplayNameInLabel = GetCellText(rca.cells, "H", rca.RowIndex, sharedStringTableItems),
        NumberOfRegisters =
                int.Parse(GetCellText(rca.cells, "K", rca.RowIndex, sharedStringTableItems))
    })
    .ToList();
var rowData=registersRows
.Select(r=>new{RowIndex=r.RowIndex,cells=r.Elements().ToList()})
.Select(rc=>new{rc.RowIndex,rc.cells,A=GetCellText(rc.cells,“A”,rc.RowIndex,sharedStringTableItems)})
.其中(rca=>include.Contains(rca.A))
.选择(rca=>new RegisterRow{
StoreNumber=rca.A,
ChannelName=GetCellText(rca.cells,“D”,rca.RowIndex,sharedStringTableItems),
ChannelDisplayName=GetCellText(rca.cells,“E”、rca.RowIndex、sharedStringTableItems),
PhysicalDeviceName=GetCellText(rca.cells,“F”,rca.RowIndex,sharedStringTableItems),
FriendlyName=GetCellText(rca.cells,“G”、rca.RowIndex、sharedStringTableItems),
DisplayNameInLabel=GetCellText(rca.cells,“H”,rca.RowIndex,sharedStringTableItems),
寄存器数=
int.Parse(GetCellText(rca.cells,“K”,rca.RowIndex,sharedStringTableItems))
})
.ToList();

我没有遵循where子句中的“?你的意思是在“选择”lambda中吗?是的,从
WHERE
函数到
Select
函数,换句话说,传递WHERE函数的中间结果,这样选择函数就不必做同样的工作。这是一个很好的思考方法。谢谢