代码之家  ›  专栏  ›  技术社区  ›  Shantanu Gupta

如何用等价委托代替Linq Where子句中的lambda

  •  0
  • Shantanu Gupta  · 技术社区  · 16 年前

    用这个我得到了想要的结果。但我不清楚这个表达式是如何计算的。

    我试图通过在下面创建delegate和替换condition来打破这个lambda表达式 Where 具有委托类型。

    如果我必须重写同样的东西,写一个委托而不是匿名类型。语法是什么。如何返回相同的代理。

    if (((DataTable)dgvAssignedRpm.DataSource).AsEnumerable()
        .Where(row => row.Field<long>("FK_RPM_BTN_SETTING_ID") == objRpmButtonHolder.RpmSettingId).Count() > 1)
    {
      List<DataRow> listPkgBtnSettings = SearchForExistingSettingId();
    }
    
    2 回复  |  直到 16 年前
        1
  •  1
  •   Julien Hoarau    16 年前
    void MethodSignature(...) 
    { 
      ...  
    
      if (((DataTable)dgvAssignedRpm.DataSource).AsEnumerable()
        .Where(RowCondition)
      {
        List<DataRow> listPkgBtnSettings = SearchForExistingSettingId();
      }
    
      ...
    }
    
    // Where want a Func<T,bool> parameter 
    // T is the first parameter type (DataRow here)
    // bool represents the return value
    bool RowCondition(DataRow row)
    {
      return row.Field<long>("FK_RPM_BTN_SETTING_ID") == objRpmButtonHolder.RpmSettingId).Count() > 1
    }
    
        2
  •  1
  •   wvdhouten    16 年前

            if (((DataTable)dgvAssignedRpm.DataSource).AsEnumerable().Where(
                delegate(DataRow row) {
                    return (row.Field<long>("FK_RPM_BTN_SETTING_ID") == objRpmButtonHolder.RpmSettingId.Count() > 1); 
                }))
            {
                List<DataRow> listPkgBtnSettings = SearchForExistingSettingId();
            }
    

    但我现在是早上,所以请原谅我有点不舒服。

    对于您的问题,它为什么要求Func<gt;以及如何工作。您使用的语句是LINQ,因此我为您找到了一个关于此的参考,它可能比我更好地解释: http://blogs.msdn.com/b/mirceat/archive/2008/03/13/linq-framework-design-guidelines.aspx

    但是,函数中的最后一个类型是它返回的值。(但是,我仍然建议使用Lambda表达式,因为它非常干净、整洁,而且功能最好。

    希望我能帮上忙。