我有一个类似于下面的 linq 语句:
var entities = from row in table.AsEnumerable()
select new
{
ID = row.ID,
X = GetObjectByProcessingID(row.ID)[0],
Y = GetObjectByProcessingID(row.ID)[1],
....
};
是否可以这样做:
var entities = from row in table.AsEnumerable()
select new
{
private var tmp = GetObjectByProcessingID(row.ID),
ID = row.ID,
X = tmp[0],
Y = tmp[1],
....
};
避免调用 GetObjectByProcessingID 两次?
我知道你可以这样做:
var entities = from row in table.AsEnumerable()
select new
{
ID = row.ID,
XAndY = GetObjectByProcessingID(row.ID),
....
};
但在这种情况下,它将暴露整个数组。我也知道我可以在方法端 (GetObjectByProcessingID) 实现诸如缓存之类的东西,或者创建一个辅助方法来调用它并记住最后一个值(如果 ID 相同)。但是有更好的方法吗?我可以在创建匿名类型时创建临时变量吗?
最佳答案
像这样使用 let
关键字:
var entities = from row in table.AsEnumerable()
let tmp = GetObjectByProcessingID(row.ID)
select new {
ID = row.ID,
X = tmp[0],
Y = tmp[1],
....
};
你也可以尝试使用我非常喜欢的方法语法
:
var entities = table.AsEnumerable()
.Select(row => {
var tmp = GetObjectByProcessingID(row.ID);
return new {
ID = row.ID,
X = tmp[0],
Y = tmp[1],
....
};
});
关于c# - 匿名类型中的临时变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19521554/