internal static void GroupData(ChartVisibleSeriesCollection visibleSeries) { List <string> groupingValues = new List <string>(); // Get the x values from the series. foreach (var series in visibleSeries) { if (series is WaterfallSeries || series is ErrorBarSeries || series is HistogramSeries || series is PolarRadarSeriesBase) { return; } if (series.ActualXValues is List <string> ) { groupingValues.AddRange(series.ActualXValues as List <string>); } else { groupingValues.AddRange(from val in (series.ActualXValues as List <double>) select val.ToString()); } } var distinctXValues = groupingValues.Distinct().ToList(); foreach (var series in visibleSeries) { if (series.ActualXValues is List <string> ) { series.GroupedXValuesIndexes = (from val in (List <string>)series.ActualXValues select(double) distinctXValues.IndexOf(val)).ToList(); } else { series.GroupedXValuesIndexes = (from val in series.ActualXValues as List <double> select(double) distinctXValues.IndexOf(val.ToString())).ToList(); } series.GroupedXValues = distinctXValues; } foreach (var series in visibleSeries) { series.DistinctValuesIndexes.Clear(); var aggregateValues = new Dictionary <int, List <double> > [series.ActualSeriesYValues.Length]; var yValues = new List <double> [series.ActualSeriesYValues.Length]; series.GroupedSeriesYValues = new IList <double> [series.ActualSeriesYValues.Length]; bool isRangeColumnSingleValue = series is RangeColumnSeries && !series.IsMultipleYPathRequired; for (int i = 0; i < series.ActualSeriesYValues.Length; i++) { series.GroupedSeriesYValues[i] = new List <double>(); aggregateValues[i] = new Dictionary <int, List <double> >(); ((List <double>)series.GroupedSeriesYValues[i]).AddRange(series.ActualSeriesYValues[i]); if (isRangeColumnSingleValue) { break; } } var actualXValues = series.ActualXValues is List <string> ?series.ActualXValues as List <string> : (from val in (series.ActualXValues as List <double>) select val.ToString()).ToList(); for (int i = 0; i < distinctXValues.Count; i++) { int count = 0; var indexes = new List <int>(); for (int j = 0; j < series.ActualSeriesYValues.Length; j++) { yValues[j] = new List <double>(); if (isRangeColumnSingleValue) { break; } } (from xValues in actualXValues let index = count++ where distinctXValues[i] == xValues select index).Select(t1 => { for (int j = 0; j < series.ActualSeriesYValues.Length; j++) { yValues[j].Add(series.ActualSeriesYValues[j][count - 1]); if (j == 0) { indexes.Add(count - 1); } if (isRangeColumnSingleValue) { break; } } return(0); }).ToList(); for (int j = 0; j < series.ActualSeriesYValues.Length; j++) { aggregateValues[j].Add(i, yValues[j]); if (isRangeColumnSingleValue) { break; } } series.DistinctValuesIndexes.Add(i, indexes); } var aggregateValue = series.ActualXAxis is CategoryAxis ? (series.ActualXAxis as CategoryAxis).AggregateFunctions : AggregateFunctions.None; if (aggregateValue != AggregateFunctions.None) { series.DistinctValuesIndexes.Clear(); series.GroupedXValuesIndexes.Clear(); for (int i = 0; i < series.ActualSeriesYValues.Length; i++) { series.GroupedSeriesYValues[i].Clear(); if (isRangeColumnSingleValue) { break; } } for (int i = 0; i < distinctXValues.Count; i++) { series.GroupedXValuesIndexes.Add(i); for (int j = 0; j < series.ActualSeriesYValues.Length; j++) { if (aggregateValues[j][i].Count > 0) { switch (aggregateValue) { case AggregateFunctions.Average: series.GroupedSeriesYValues[j].Add(aggregateValues[j][i].Average()); break; case AggregateFunctions.Count: series.GroupedSeriesYValues[j].Add(aggregateValues[j][i].Count()); break; case AggregateFunctions.Max: series.GroupedSeriesYValues[j].Add(aggregateValues[j][i].Max()); break; case AggregateFunctions.Min: series.GroupedSeriesYValues[j].Add(aggregateValues[j][i].Min()); break; case AggregateFunctions.Sum: series.GroupedSeriesYValues[j].Add(aggregateValues[j][i].Sum()); break; } } if (isRangeColumnSingleValue) { break; } } var trackballIndex = new List <int> { i }; series.DistinctValuesIndexes.Add(i, trackballIndex); } } } }
/// <summary> /// Check whether the declared series is manhattan. /// </summary> /// <param name="visibleSeries">The Visible Series</param> /// <param name="axis3D">The 3D Axis</param> /// <returns>Returns a value indicating whether the declared series is manhattan.</returns> private static bool IsDeclaredSeriesManhattan(ChartVisibleSeriesCollection visibleSeries, ChartAxisBase3D axis3D) { return(axis3D.IsZAxis && visibleSeries.Count > 0 && visibleSeries.All(series => (series is AreaSeries3D || series is LineSeries3D))); }