2010-12-27 8 views
1

Ich habe die folgende SammlungWie gruppiere ich Elemente aus einer Sammlung mit LINQ und das Rück der Formdaten entsprechend dem Kollektionstyp

public IQueryable<myObjectType > GetWorkCellLoadGraphDataByIdDummy() 
    { 
     IList<myObjectType> workCellLoadGraphDataCollection = new List<myObject>() 
      { 
       new myObjectType(DateTime.Today.AddHours(8).AddMinutes(30), 1), 
       new myObjectType(DateTime.Today.AddHours(10).AddMinutes(10), 6), 
       new myObjectType(DateTime.Today.AddHours(13).AddMinutes(30),8), 

       new myObjectType(DateTime.Today.AddDays(1).AddHours(8).AddMinutes(30), 1), 
       new myObjectType(DateTime.Today.AddDays(1).AddHours(10).AddMinutes(10), 5), 
       new myObjectType(DateTime.Today.AddDays(1).AddHours(13).AddMinutes(30), 2) 
      }; 


     // Write some LINQ code to group data according to first parameter 
     // Perform sum of last parameter 
     // Shape the data to be in the form of myObjectType 

     // return result; 
    } 

und was ich will durch den ersten Parameter der zum Gruppieren von Elementen zu tun ist, myObjectType-Klasse.

Dann für jede Gruppierung würde ich gerne die Summe aller letzten Parameter tun.

Schließlich sollte das Ergebnis in Form von „myObjectType“

Ich weiß, wie es zu tun auf die altmodische Art und Weise das heißt Schleife durch alle Elemente und machen die Summen zurückgeschickt werden. Ich würde jedoch gerne in LINQ lernen, was ich gerade begonnen habe.

Kann mir jemand in die richtige Richtung zeigen, damit ich meine Anforderungen in LINQ übersetzen kann?

Tatsächlich sollte das Ergebnis eine Sammlung myObjectType sein, die zwei Objekte vom Typ wie folgt:

  • erstes Objekt in Sammlung (DateTime.Today, 15)
  • zweites Objekt in Sammlung (Datetime .Today.AddDays (1), 8)

TIA,

David

Antwort

3

eine Klasse mit diesem Grunddesign

class MyObjectType 
{ 
    public MyObjectType(DateTime date, int count) 
    { 
     this.MyDate = date; 
     this.MyCount = count; 
    } 

    public DateTime MyDate { get; set; } 
    public int MyCount { get; set; } 
} 

Sie könnten erfüllen Ihre Anforderung mit LINQ in der Art und Weise unten. Das erste Beispiel erzeugt IEnumerable<MyObjectType> unter Verwendung der Syntax der fließenden Erweiterungsmethode.

var query = collection.GroupBy(obj => obj.MyDate.Date) 
         .Select(grp => 
           new MyObjectType(grp.Key, grp.Sum(obj => obj.MyCount)) 
          ); 

Die zweite Version erzielt das gleiche Ergebnis, verwendet jedoch die SQL-artige Abfrageausdrucksyntax.

var query = from obj in collection 
      group obj by obj.MyDate.Date into grp 
      let mySum = grp.Sum(item => item.MyCount) 
      select new MyObjectType(grp.Key, mySum); 

Von dort nutzen Sie die Erweiterungsmethoden AsQueryable ein IQueryable Ergebnis zu erzielen, oder ToList()/ToArray() konkrete Sammlungen zu erhalten.

+0

Danke Anthony, das war genau das, was ich brauchte. – DavidS