2017-04-17 118 views
-1

我有以下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})"; 
    } 
} 

这是从我要走了需要再次。

+0

你尝试过什么?请展示你的工作。 – Soviut

+0

什么是“计数”?请显示您迄今为止所尝试的内容。你是什​​么意思矩阵?这是一个C#对象吗? –

+0

我不确定你在问什么或试图在这里做什么。你只是想输出它们吗? –

回答

1

要组由整个对象和计数事件(或者换句话说“计数重复”)由迭代项只是组这样的:

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" } 
}; 

结果是:

enter image description here

请注意,由Customer对象分组使用其EqualsGetHashCode比较对象,然后确保覆盖它们。你可以看一下this question

也看到对象的所有属性都在Key性能不与你的榜样输出保持一致,但确实与所提供的GroupResult对准你显示

+0

我认为我过分复杂化了我的要求。谢谢@Gilad – HaBo

+0

@HaBo - 这是否适合你? –

+0

是的,它的工作。再次感谢 – HaBo