2011-01-05 7 views
3

Gibt es eine Möglichkeit, ein segmentiertes Histogramm mit linq zu erstellen? Ich habe mehrere Beispiele gesehen, in denen Sie die Anzahl der Ereignisse eines bestimmten Objekts zählen können. Ist es möglich, ein Linq-basiertes Historgramm zu erstellen, das die Anzahl der Vorkommen einer Reihe von Objekten zwischen zwei Werten zählt?Histrogramm mit Linq

Ich weiß nicht, wie Sie nach einer Reihe von Elementen gruppieren würden, um die für ein Histogramm erforderlichen Buckets zu erstellen. Angenommen, eine Startgrenze und eine Breite werden zum Erstellen des Bereichs verwendet.

Sie müssten das Nummernfeld durchlaufen und jede Nummer gruppieren, je nachdem, ob es < = Upper Bound und> Lower Bound war. Dann würden Sie einfach jede Gruppe summieren. Ich habe keine Ahnung, wie die Gruppe von

Teil erreichen

Antwort

3

So ähnlich?

 Random randF = new Random(); 
     List<double> nums = new List<double>(); 
     for (int i = 0; i < 100000; i++) 
     { 
      nums.Add(randF.NextDouble()*100); 
     } 

     double fromXF = 30; 
     double toXF = 80; 
     int groupCount = 10; // number of groups between values 
     var histF = from i in nums 
        let groupKeyF = ((i-fromXF)/(toXF-fromXF)*groupCount) // even distribution of "groupCount" groups between fromXF and toXF, simple math, really 
        where groupKeyF >= 0 && groupKeyF < groupCount // only groups we want 
        let groupKey = (int)groupKeyF // clamp it to only group number 
        group i by groupKey into gr // group it according to group number 
        orderby gr.Key 
        select new { Value = gr.Key, Count = gr.Count() }; 

     foreach (var item in histF) 
     { 
      Console.WriteLine("Group number: " + item.Value + ", Count: " + item.Count); 
     } 
+0

Das sieht nach einer guten Lösung aus. Ich bin nicht so gut mit LINQ, also muss ich es versuchen. Vielen Dank. – James

+0

Golden. Wirklich gepflegte Verwendung von LINQ. Vielen Dank – James

3

Sie so etwas wie tun könnte:

var groups = input.GroupBy(x => (int)((x.value - start)/width));

, die für jede Bar und Gruppen, die durch die einen ganzzahligen Wert erzeugt.