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,
...
});
我想知道如何避免匿名类型对数据进行分组,因为键可能是一个,两个.. 根据客户 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,
...
});