From f28d9407d6b4155f09da01afee52d1d72c24a09b Mon Sep 17 00:00:00 2001 From: Paul Anderson Date: Tue, 26 May 2026 14:39:35 +0530 Subject: [PATCH 1/2] Perf: Hoist ToList() out of loops in CartesianChartArea In UpdateSBS() and GetTotalWidth(), SideBySideSeriesPosition.Values.ToList() was called inside a for-loop, creating a new List<> allocation on every iteration. This is O(n) allocations where only 1 is needed. Hoisted the ToList() call before both loops so the dictionary values are materialized once and reused. Also adds a unit test for UpdateSBS with multiple series groups. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .../Charts/Area/Partial/CartesianChartArea.cs | 10 ++++--- .../Chart/Features/ChartAreaUnitTest.cs | 27 +++++++++++++++++++ 2 files changed, 33 insertions(+), 4 deletions(-) diff --git a/maui/src/Charts/Area/Partial/CartesianChartArea.cs b/maui/src/Charts/Area/Partial/CartesianChartArea.cs index ad6d14bf..a0897e61 100644 --- a/maui/src/Charts/Area/Partial/CartesianChartArea.cs +++ b/maui/src/Charts/Area/Partial/CartesianChartArea.cs @@ -182,10 +182,11 @@ internal void UpdateSBS() { double totalWidth = GetTotalWidth() / SideBySideSeriesPosition.Count; double startPosition = 0, end = 0; + var seriesGroups = SideBySideSeriesPosition.Values.ToList(); - for (int i = 0; i < SideBySideSeriesPosition.Count; i++) + for (int i = 0; i < seriesGroups.Count; i++) { - var seriesGroup = SideBySideSeriesPosition.Values.ToList()[i]; + var seriesGroup = seriesGroups[i]; double sbsMaxWidth = GetSBSMaxWidth(seriesGroup); foreach (ChartSeries chartSeries in seriesGroup) @@ -370,10 +371,11 @@ double GetTotalWidth() if (SideBySideSeriesPosition != null) { - for (int i = 0; i < SideBySideSeriesPosition.Count; i++) + var seriesGroups = SideBySideSeriesPosition.Values.ToList(); + for (int i = 0; i < seriesGroups.Count; i++) { double maxWidth = 0; - foreach (ChartSeries sideBySideSeries in SideBySideSeriesPosition.Values.ToList()[i]) + foreach (ChartSeries sideBySideSeries in seriesGroups[i]) { CartesianSeries cartesianSeries = (CartesianSeries)sideBySideSeries; double width = cartesianSeries.GetActualWidth(); diff --git a/maui/tests/Syncfusion.Maui.Toolkit.UnitTest/Chart/Features/ChartAreaUnitTest.cs b/maui/tests/Syncfusion.Maui.Toolkit.UnitTest/Chart/Features/ChartAreaUnitTest.cs index 3b7acce9..ea19d989 100644 --- a/maui/tests/Syncfusion.Maui.Toolkit.UnitTest/Chart/Features/ChartAreaUnitTest.cs +++ b/maui/tests/Syncfusion.Maui.Toolkit.UnitTest/Chart/Features/ChartAreaUnitTest.cs @@ -49,6 +49,33 @@ public void GetTotalWidth_Test() } + [Fact] + public void UpdateSBS_WithMultipleSeriesGroups_ShouldComputeSbsInfo() + { + var chart = new SfCartesianChart(); + var series1 = new ColumnSeries() { Width = 0.8 }; + var series2 = new ColumnSeries() { Width = 0.8 }; + var series3 = new ColumnSeries() { Width = 0.6 }; + + var area = new CartesianChartArea(chart) + { + SideBySideSeriesPosition = new Dictionary> + { + { 0, new List { series1, series2 } }, + { 1, new List { series3 } } + }, + EnableSideBySideSeriesPlacement = false, + SideBySideMinWidth = 1 + }; + + area.UpdateSBS(); + + // Verify SbsInfo is set on each series + Assert.NotEqual(DoubleRange.Empty, series1.SbsInfo); + Assert.NotEqual(DoubleRange.Empty, series2.SbsInfo); + Assert.NotEqual(DoubleRange.Empty, series3.SbsInfo); + } + [Fact] public void AddAxes_ShouldSetParentAndArea() { From 93a56cf3dd4a5bf581fdac01c264480404462197 Mon Sep 17 00:00:00 2001 From: SaiyathAliFathima <103025761+SaiyathAliFathima@users.noreply.github.com> Date: Sat, 6 Jun 2026 11:07:55 +0530 Subject: [PATCH 2/2] Update CartesianChartArea.cs --- maui/src/Charts/Area/Partial/CartesianChartArea.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/maui/src/Charts/Area/Partial/CartesianChartArea.cs b/maui/src/Charts/Area/Partial/CartesianChartArea.cs index d2ddf788..5bb4cab4 100644 --- a/maui/src/Charts/Area/Partial/CartesianChartArea.cs +++ b/maui/src/Charts/Area/Partial/CartesianChartArea.cs @@ -184,7 +184,6 @@ internal void UpdateSBS() { double totalWidth = GetTotalWidth() / SideBySideSeriesPosition.Count; double startPosition = 0, end = 0; - var seriesGroups = SideBySideSeriesPosition.Values.ToList(); var seriesPositionValues = SideBySideSeriesPosition.Values.ToList(); for (int i = 0; i < SideBySideSeriesPosition.Count; i++)