C# 在C中使用LINQ select作为方法参数

C# 在C中使用LINQ select作为方法参数,c#,linq,lambda,expression,C#,Linq,Lambda,Expression,我正在尝试创建一个用于HTML表构建的通用方法 作为我需要的功能的一部分,我希望用户能够指定将转换为列的属性 由于这是一种通用方法,我原以为用户可以将所需的属性作为某种LINQ表达式传入,因此我会将此select应用于数据集,并循环遍历属性以构建表数据: public static string BuildCollapsibleHtmlTable<T>( IEnumerable<T> dataSet, Func<T, object

我正在尝试创建一个用于HTML表构建的通用方法

作为我需要的功能的一部分,我希望用户能够指定将转换为列的属性

由于这是一种通用方法,我原以为用户可以将所需的属性作为某种LINQ表达式传入,因此我会将此select应用于数据集,并循环遍历属性以构建表数据:

  public static string BuildCollapsibleHtmlTable<T>(
        IEnumerable<T> dataSet,
        Func<T, object> tableDataColumnDefinitions,
        KeyValuePair<string, string>[] tableColumnNames,
        Func<T, object> groupByQuery,
        Func<T, decimal> groupSumQuery) where T : class, new() {

      ... implementation ..
   }
“tableColumnDefinitions”部分是我要讨论的第二个参数。我可以将其用于分组和求和,但不能用于选择要在表中使用的列/属性:

var test = HtmlBuilders.BuildCollapsibleHtmlTable<Client>(
               Model.Clients,
               (clients => clients.ClientName),
               new KeyValuePair<string, string>[] { 
                   new KeyValuePair<string, string> ("Client", "tdCSSLeft"),
                   new KeyValuePair<string, string> ("Debt", "tdCSSCenter")
                },
               (client => client.ClientName),
               (client => client.TotalDebt)
           );

我似乎只能让它一次拉动一个属性,因此我需要一个表达式数组。我并不反对这一点,但想知道我是否在这一点上完全错了?是否有更简单/更好的方法将任意select查询作为参数传递?

是的,您需要使用数组。请注意,您似乎已经有了一个类似的数组:KeyValuePair[]tableColumnNames,所以我不知道问题出在哪里

从技术上讲,您可以通过以下方式更改方法的签名:

public static string BuildCollapsibleHtmlTable<T>(
    IEnumerable<T> dataSet,
    KeyValuePair<string, string>[] tableColumnNames,
    Func<T, object> groupByQuery,
    Func<T, decimal> groupSumQuery,
    params Func<T, object>[] tableDataColumnDefinitions
) where T : class, new() {
因此,在调用该方法时不需要创建数组,但可以像

var test = HtmlBuilders.BuildCollapsibleHtmlTable<Client>(
           Model.Clients,
           //new KeyValuePair<string, string>[] { 
           new[] {  // Shorter
               new KeyValuePair<string, string> ("Client", "tdCSSLeft"),
               new KeyValuePair<string, string> ("Debt", "tdCSSCenter")
           },
           (client => client.ClientName),
           (client => client.TotalDebt),

           // tableDataColumnDefinitions
           (clients => clients.ClientName),
           (clients => clients.ClientSurname),
           (clients => clients.ClientAddress)
       );

如何使用此方法一次选择所有属性?数据集。Selectxxxxxx@pierre您希望如何处理所有的属性?通常,不使用LINQ,您应该/将使用dataSet{for int i=0;i