Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# LINQ group by属性作为参数_C#_Linq - Fatal编程技术网

C# LINQ group by属性作为参数

C# LINQ group by属性作为参数,c#,linq,C#,Linq,我有一个要使用LINQ查询的对象列表。我希望能够按属性对它们进行分组 var query = from item in expense orderby item.ExpenseTime descending group item by item.Location; var query = from item in expense orderby item.ExpenseTime descending group item by item.ExpenseType;

我有一个要使用LINQ查询的对象列表。我希望能够按属性对它们进行分组

var query = from item in expense
    orderby item.ExpenseTime descending
    group item by item.Location;

var query = from item in expense
    orderby item.ExpenseTime descending
    group item by item.ExpenseType;

var query = from item in expense
    orderby item.ExpenseTime descending
    group item by item.Person;
有没有办法将属性指定为方法的参数

public static void GetExpensesBy(List<Expense> expense, Property myGroupingProperty)
{
    var query = from item in expense
                orderby item.ExpenseTime descending
                group item by item.myGroupingProperty;

    // ....
}
public static void GetExpensesBy(列出费用,属性myGroupingProperty)
{
var查询=来自费用中的项目
orderby item.ExpenseTime降序
按项分组。myGroupingProperty;
// ....
}

请注意,在查询之后,有一些代码是通用的,与组无关。

Microsoft编写了一个动态Linq库

此库允许您动态指定任何Linq查询

公共静态void GetExpensesBy(列表费用、表达式groupbyExpression)
public static void GetExpensesBy<T>(List<Expense> expense, Expression<Func<A,T>> groupbyExpression)
{
    var query = from item in expense
                orderby item.ExpenseTime descending;
    query.GroupBy(groupbyExpression);

    // ....
}
{ var查询=来自费用中的项目 orderby item.ExpenseTime降序; GroupBy(groupbyExpression); // .... }
并创造出这样的表达方式

Expression<Func<Expense, string>> group = (q) => q.Location;
expressiongroup=(q)=>q.位置;

如果您修改
GetExpenseBy
如下

public static void GetExpensesBy<TKey>(List<Expense> expense, 
                                       Func<Expense, TKey> myGroupingProperty)
{
    var query = (from item in expense
                 orderby item.ExpenseTime descending
                 select item).GroupBy(myGroupingProperty);
    // ....
}

为什么要使用表达式?我可以在同一个表达式中创建多个GroupBy吗?示例:按位置分组,然后按同一表达式中的人分组?比如GetExpensesBy(费用,项目=>item.Location,项目=>item.Person);如果需要按人员和地点分组,可以使用
GetExpensesBy(expense,item=>new{item.location,item.person})如何将其转换为字典TKey将包含什么?由于函数是一个不返回任何内容的空函数,如何从函数中获取新创建的集合?
GetExpensesBy(expense, item => item.Location);
GetExpensesBy(expense, item => item.Person);
GetExpensesBy(expense, item => item.ExpenseType);