C# 如何在LINQ表达式中预先设置变量?
我正在基于数据行创建一个对象数组,如下所示。工作时,我有点困扰,因为我通过从行中的一个单元格中提取相同的值来分配多个字段。通常,这个东西在循环之前会预先准备好,然后只设置多次,但是在这里,我要在实际迭代中才能获得值C# 如何在LINQ表达式中预先设置变量?,c#,linq,C#,Linq,我正在基于数据行创建一个对象数组,如下所示。工作时,我有点困扰,因为我通过从行中的一个单元格中提取相同的值来分配多个字段。通常,这个东西在循环之前会预先准备好,然后只设置多次,但是在这里,我要在实际迭代中才能获得值 return table.Rows.Cast<DataRow>() .Select(row => new Beep { Uno = HeavyComputation(row["ID"]), Duo = HeavyComputati
return table.Rows.Cast<DataRow>()
.Select(row => new Beep
{
Uno = HeavyComputation(row["ID"]),
Duo = HeavyComputation(row["ID"])
}).ToList();
return table.Rows.Cast()
.选择(行=>新蜂鸣音
{
Uno=重计算(第[“ID”]行),
Duo=重计算(第[“ID”]行)
}).ToList();
能否以更好的方式解决这一问题?有点像(这里只是做白日梦)那么
return table.Rows.Cast()
.Preset(“int预计算=重计算(行['ID'])”
.选择(行=>新蜂鸣音
{
Uno=预计算,
Duo=预计算
}).ToList();
请注意,实际示例有点复杂,上面的代码是该问题的最小示例。我知道Uno和Duo是多余的。您可以这样做:
return table.Rows.Cast<DataRow>()
.Select(row => {
long preComputed = HeavyComputation(row["ID"]);
return new Beep
{
Uno = preComputed,
Duo = preComputed
};
});
然后在中选择,只需写下:
return table.Rows.Cast<DataRow>().Select(TransformToBeep).ToList();
返回table.Rows.Cast().Select(TransformToBeep.ToList();
在查询表达式中,您可以使用let
进行以下操作:
return from DataRow row in table.Rows
let preComputed = HeavyComputation(row["ID"])
select new Beep
{
// Use row and preComputed here
};
要在非查询表达式中具有相同的效果,可以使用多个Select
调用:
return table.Rows.Cast<DataRow>()
.Select(row => new { row, preComputed = HeavyComputation(row["ID"]) })
// Other stuff here if you want
.Select(pair => new Beep {
Uno = pair.preComputed,
Duo = pair.preComputed,
Trio = pair.Row[...]
});
如果您乐于使用语句lambdas(而不是表达式lambdas),那么当然可以使用Klaus的方法。请记住,这不适用于LINQ to SQL之类的东西-它只适用于Enumerable
和语句lambda,不能转换为表达式树。我将冒昧地对代码进行换行,以便更好地与我交流。除此之外-完美+1+1表示SQL警告。尽管如此,他还是比你领先了几秒钟,所以这次他得到了绿色的支票
return from DataRow row in table.Rows
let preComputed = HeavyComputation(row["ID"])
select new Beep
{
// Use row and preComputed here
};
return table.Rows.Cast<DataRow>()
.Select(row => new { row, preComputed = HeavyComputation(row["ID"]) })
// Other stuff here if you want
.Select(pair => new Beep {
Uno = pair.preComputed,
Duo = pair.preComputed,
Trio = pair.Row[...]
});
return table.Rows.Cast<DataRow>()
.Select(row => HeavyComputation(row["ID"]))
.Select(preComputed => new Beep {
Uno = preComputed,
Duo = preComputed
});