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
                    });