C# 方法链中的Linq中间对象的位置和选择?
我正在处理DocumentFormat.xml 我需要做一些工作来获取where子句所需的数据 但是我需要在where子句中做同样的工作来构造所需的对象 这似乎是浪费 有没有更好的方法来构建它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
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函数的中间结果,这样选择函数就不必做同样的工作。这是一个很好的思考方法。谢谢