2017-04-17 4 views
-1

Ich habe folgende Customer Klasse:GroupBy alle Felder und Count

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

Kunden Sammlung

List<Customer> customers = //assigned range of customers 

Jetzt habe ich zum Gruppieren von allen Bereichen. Ich möchte keine einzelnen Felder auswählen. In meinem tatsächlichen Szenario läuft es dynamischer, daher kann ich die Felder nicht vordefinieren.

Von diesem customers Objekt Ich brauche eine Matrix wie zu konstruieren

Name | Email | City | count 
AB  [email protected]  ss  3 
CB  [email protected]  ss  2 
EF  [email protected]  ss  34 
ek  g.com  we  84 

Ich habe versucht, diesen Weg gehen. Erweiterung Methode zur Gruppe von mehreren Spalten

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()); 
} 

und nennen Sie es wie

customers.GroupByMany(displayFields); 

Problem ist, ich bin die Ergebnisse als verschachtelte Gruppen bekommen

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

, die weg von dem, was ich wird brauche ich wieder.

+0

Was haben Sie versucht? Bitte zeigen Sie Ihre Arbeit. – Soviut

+0

Was ist die "Zählung" von? Bitte zeigen Sie, was Sie bisher versucht haben. Und was meinst du mit Matrix? Ist das ein C# -Objekt? –

+0

Ich bin mir nicht sicher, was Sie hier fragen oder versuchen zu tun. Willst du sie nur ausgeben? –

Antwort

1

durch das gesamte Objekt zu gruppieren und Vorkommen zählen (oder mit anderen Worten „Duplikate count“) Gruppe nur durch die iterative Artikel wie folgt aus:

var result = from item in customers 
      group 1 by item into grouping 
      select new { 
       grouping.Key, 
       Count = grouping.Count() 
      }; 

Für Beispieldaten von:

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

Ergebnis ist:

enter image description here

Beachten Sie, dass die Gruppierung durch das Objekt CustomerEquals und GetHashCode zum Vergleichen der Objekte verwendet, und stellen Sie sicher, dass sie überschrieben werden. Sie können this question

Betrachten Sie auch sehen, dass alle Eigenschaften des Objekts sind Eigenschaften in Key, die nicht mit Ihrem Beispiel Ausgang nicht ausrichten, aber mit der mitgelieferten GroupResult Sie zeigte sich ausrichten

+0

Ich denke, dass ich meine Anforderung übermäßig verkompliziert habe. Danke @Gilad – HaBo

+0

@HaBo - Hat das für Sie funktioniert? –

+0

Ja, es hat funktioniert. Nochmals vielen Dank – HaBo