IGrouping 避免匿名类型

IGrouping avoiding anonymous types

我想知道如何避免匿名类型对数据进行分组,因为键可能是一个,两个.. 根据客户 selection.

示例:

我们有一个class

public class Customer
{
    public string Name { get; set; }

    public int Age { get; set; }

    public string Location { get; set; }

    public char Genre { get; set; }
}

通过选中的列表框,您可以select参数对数据进行分组,其中选项为:

所以我们可能有 1 到 4 个键来对数据进行分组。

我想避免使用 switch case 或多个 if 语句来获取正确的 IGrouping 数据。

我想避免:

 public IGrouping<object,Customer> GetGroups(IEnumerable<Customer> data)
 {
    if("Name is selected")
    {
        return data.GroupBy(e => e.Name);
    }
    if("Name and Age are selected")
    {
        return data.GroupBy(e => new { e.Name, e.Age });
    }
}

这个有效,有点作弊,您只需确保分组键根据您希望的分组具有正确的值即可。下面是有效的,因为如果你不想按给定的 属性 分组,你只需设置一个默认值(每个项目都相同)。

    bool groupByName = false;
    bool groupByAge = false;
    bool groupByLocation = false;
    bool groupByGenre = true;
    
    var result = from x in items
                 group x by new { 
                                    Name = (!groupByName ? "" : x.Name), 
                                    Age = (!groupByAge ? 0 : x.Age),
                                    Location = (!groupByLocation ? "" : x.Location),
                                    Genre = (!groupByGenre ? ' ' : x.Genre)
                                } 
                                    into g
                 select g;

不确定这是否是您要找的东西,但可能会有帮助:

return data.GroupBy(g =>
  new {
    Name = includeName ? g.Name : null,
    Age = includeAge ? g.Age : null,
    ... 
  });