Пример #1
0
        protected int CompareScenarios(ArrayList x, ArrayList y)
        {
            if (x.Count == 0 && y.Count == 0)
            {
                return(0);
            }

            if (this.scenarioOrderSorter != null)
            {
                x.Sort(this.scenarioOrderSorter);
                y.Sort(this.scenarioOrderSorter);
            }
            else
            {
                x.Sort(scenarioValueSorter);
                y.Sort(scenarioValueSorter);
            }

            for (int i = 0; i < x.Count; ++i)
            {
                if (i > y.Count - 1)
                {
                    // x is bigger, return y first
                    return(1);
                }


                int scenReturn = 0;
                if (scenarioOrderSorter != null)
                {
                    scenReturn = scenarioOrderSorter.Compare(x[i], y[i]);
                }
                else
                {
                    scenReturn = scenarioValueSorter.Compare(x[i], y[i]);
                }

                if (scenReturn != 0)
                {
                    return(scenReturn);
                }
            }

            // if y is bigger, return x first
            return(y.Count > x.Count ? -1 : 0);
        }
Пример #2
0
        public int Compare(object x, object y)
        {
            Scenario scenX = x as Scenario;
            Scenario scenY = y as Scenario;

            int retValue = 0;

            if (scenX.DimensionInfo != null && scenY.DimensionInfo != null)
            {
                //both segments are dimensions, sort by the order defined in the taxonomy
                NodeSortingWrapper xWrapper = nodeSortingWrappers.ContainsKey(scenX.DimensionInfo.ToString()) ? nodeSortingWrappers[scenX.DimensionInfo.ToString()] : null;
                NodeSortingWrapper yWrapper = nodeSortingWrappers.ContainsKey(scenY.DimensionInfo.ToString()) ? nodeSortingWrappers[scenY.DimensionInfo.ToString()] : null;

                if (xWrapper == null && yWrapper == null)
                {
                    return(ScenarioValueSorter.Compare(scenX, scenY));
                }
                else if (xWrapper == null && yWrapper != null)
                {
                    return(-1);
                }
                else if (yWrapper == null && xWrapper != null)
                {
                    return(1);
                }

                DimensionNode xNode = null;
                DimensionNode yNode = null;

                //Determine if the nodes are at the same level.  If they are not then find the parent/grandparent
                //of the lower level node that is at the same level as the other node.
                if (xWrapper.Level > yWrapper.Level)
                {
                    Node node = xWrapper.TheNode;
                    for (int i = xWrapper.Level; i > yWrapper.Level; i--)
                    {
                        node = node.Parent;
                    }
                    xNode = node as DimensionNode;
                    yNode = yWrapper.TheNode as DimensionNode;
                }
                else if (xWrapper.Level < yWrapper.Level)
                {
                    Node node = yWrapper.TheNode;
                    for (int i = yWrapper.Level; i > xWrapper.Level; i--)
                    {
                        node = node.Parent;
                    }
                    xNode = xWrapper.TheNode as DimensionNode;
                    yNode = node as DimensionNode;
                }
                else
                {
                    xNode = xWrapper.TheNode as DimensionNode;
                    yNode = yWrapper.TheNode as DimensionNode;
                }

                //Do the nodes share the same parent, if so then sort based on their own order
                //otherwise sort on the order of the parents.
                if (xNode.Parent.Id == yNode.Parent.Id)
                {
                    retValue = xNode.Order.CompareTo(yNode.Order);
                    if (retValue != 0)
                    {
                        return(retValue);
                    }

                    //The xNode and yNode have the same order, and the same parent, so they must be the same node
                    //check to see if the original nodes are different and if so sort the lower level node after the
                    //higher level one
                    retValue = xWrapper.Level.CompareTo(yWrapper.Level);
                    if (retValue != 0)
                    {
                        return(retValue);
                    }
                }
                else
                {
                    //Navigate up the tree until we find a common parent, then compare the order of the nodes
                    //one level down from that parent
                    DimensionNode xParent = xNode.Parent as DimensionNode;
                    DimensionNode yParent = yNode.Parent as DimensionNode;
                    while (xParent != null &&
                           yParent != null &&
                           xParent.Id != yParent.Id)
                    {
                        xNode   = xParent;
                        yNode   = yParent;
                        xParent = xNode.Parent as DimensionNode;
                        yParent = yNode.Parent as DimensionNode;
                    }

                    if (string.IsNullOrEmpty(xParent.Id) && string.IsNullOrEmpty(xParent.Id))
                    {
                        //The dimensions belong to different reports, sort by the report name
                        retValue = xParent.Label.CompareTo(yParent.Label);
                        if (retValue != 0)
                        {
                            return(retValue);
                        }
                    }
                    else
                    {
                        retValue = xNode.Order.CompareTo(yNode.Order);
                        if (retValue != 0)
                        {
                            return(retValue);
                        }
                    }
                }

                //The nodes are equal from a dimension standpoint, just make sure the values are the same
                //as well
                return(ScenarioValueSorter.Compare(scenX, scenY));
            }
            else
            {
                //One or both of the scenarios are not dimensions, sort by value
                return(ScenarioValueSorter.Compare(scenX, scenY));
            }
        }