的GroupBy各个领域并获得数
问题描述:
我有以下Customer
类:的GroupBy各个领域并获得数
public class Customer
{
public string Name {get; set;}
public string Email {get; set;}
public string City {get; set;}
}
客户收集
List<Customer> customers = //assigned range of customers
现在我需要按所有领域。我不想选择单个字段。在我的实际场景中,它运行得更加动态,所以我无法预先定义这些字段。
从这个customers
对象,我需要构建一个矩阵像
Name | Email | City | count
AB [email protected] ss 3
CB [email protected] ss 2
EF [email protected] ss 34
ek g.com we 84
我尝试走这条路。通过多列
public static IEnumerable<GroupResult> GroupByMany<TElement>(
this IEnumerable<TElement> elements, List<string> groupSelectors)
{
var selectors =
new List<Func<TElement, object>>(groupSelectors.Count);
foreach (var selector in groupSelectors)
{
LambdaExpression lambdaExpression =
System.Linq.Dynamic.DynamicExpression.ParseLambda(typeof(TElement), typeof(object), $"it[\"{selector}\"]");
selectors.Add((Func<TElement, object>) lambdaExpression.Compile());
}
return elements.GroupByMany(selectors.ToArray());
}
,并调用它像
customers.GroupByMany(displayFields);
问题 扩展方法组是我得到的结果作为嵌套组
public class GroupResult
{
public object Key { get; set; }
public int Count { get; set; }
public IEnumerable Items { get; set; }
public IEnumerable<GroupResult> SubGroups { get; set; }
public override string ToString()
{
return $"{Key} ({Count})";
}
}
这是从我要走了需要再次。
答
要组由整个对象和计数事件(或者换句话说“计数重复”)由迭代项只是组这样的:
var result = from item in customers
group 1 by item into grouping
select new {
grouping.Key,
Count = grouping.Count()
};
对于采样数据:
var customers = new List<Customer>
{
new Customer { Name = "a", City = "a" },
new Customer { Name = "a", City = "a" },
new Customer { Name = "a", City = "b" },
new Customer { Name = "b", City = "b" }
};
结果是:
请注意,由Customer
对象分组使用其Equals
和GetHashCode
比较对象,然后确保覆盖它们。你可以看一下this question
也看到对象的所有属性都在Key
性能不与你的榜样输出保持一致,但确实与所提供的GroupResult
对准你显示
你尝试过什么?请展示你的工作。 – Soviut
什么是“计数”?请显示您迄今为止所尝试的内容。你是什么意思矩阵?这是一个C#对象吗? –
我不确定你在问什么或试图在这里做什么。你只是想输出它们吗? –