/// <summary> /// Utility function called by Group-Object to create Groups. /// </summary> /// <param name="currentObjectEntry">Input object that needs to be grouped.</param> /// <param name="noElement">True if we are not accumulating objects.</param> /// <param name="groups">List containing Groups.</param> /// <param name="groupInfoDictionary">Dictionary used to keep track of the groups with hash of the property values being the key.</param> /// <param name="orderByPropertyComparer">The Comparer to be used while comparing to check if new group has to be created.</param> private static void DoOrderedGrouping( OrderByPropertyEntry currentObjectEntry, bool noElement, List <GroupInfo> groups, Dictionary <object, GroupInfo> groupInfoDictionary, OrderByPropertyComparer orderByPropertyComparer) { var currentObjectOrderValues = currentObjectEntry.orderValues; if (currentObjectOrderValues != null && currentObjectOrderValues.Count > 0) { object currentTupleObject = PSTuple.ArrayToTuple(currentObjectOrderValues); if (groupInfoDictionary.TryGetValue(currentTupleObject, out var currentGroupInfo)) { // add this inputObject to an existing group currentGroupInfo.Add(currentObjectEntry.inputObject); } else { bool isCurrentItemGrouped = false; if (groups.Count > 0) { var lastGroup = groups[groups.Count - 1]; // Check if the current input object can be converted to one of the already known types // by looking up in the type to GroupInfo mapping. if (orderByPropertyComparer.Compare(lastGroup.GroupValue, currentObjectEntry) == 0) { lastGroup.Add(currentObjectEntry.inputObject); isCurrentItemGrouped = true; } } if (!isCurrentItemGrouped) { // create a new group s_tracer.WriteLine("Create a new group: {0}", currentObjectOrderValues); GroupInfo newObjGrp = noElement ? new GroupInfoNoElement(currentObjectEntry) : new GroupInfo(currentObjectEntry); groups.Add(newObjGrp); groupInfoDictionary.Add(currentTupleObject, newObjGrp); } } } }
/// <summary> /// Utility function called by Group-Object to create Groups. /// </summary> /// <param name="currentObjectEntry">Input object that needs to be grouped.</param> /// <param name="noElement">true if we are not accumulating objects</param> /// <param name="groups">List containing Groups.</param> /// <param name="groupInfoDictionary">Dictionary used to keep track of the groups with hash of the property values being the key.</param> /// <param name="orderByPropertyComparer">The Comparer to be used while comparing to check if new group has to be created.</param> internal static void DoGrouping(OrderByPropertyEntry currentObjectEntry, bool noElement, List <GroupInfo> groups, Dictionary <object, GroupInfo> groupInfoDictionary, OrderByPropertyComparer orderByPropertyComparer) { if (currentObjectEntry != null && currentObjectEntry.orderValues != null && currentObjectEntry.orderValues.Count > 0) { object currentTupleObject = PSTuple.ArrayToTuple(currentObjectEntry.orderValues.ToArray()); GroupInfo currentGroupInfo = null; if (groupInfoDictionary.TryGetValue(currentTupleObject, out currentGroupInfo)) { if (currentGroupInfo != null) { //add this inputObject to an existing group currentGroupInfo.Add(currentObjectEntry.inputObject); } } else { bool isCurrentItemGrouped = false; for (int groupsIndex = 0; groupsIndex < groups.Count; groupsIndex++) { // Check if the current input object can be converted to one of the already known types // by looking up in the type to GroupInfo mapping. if (orderByPropertyComparer.Compare(groups[groupsIndex].GroupValue, currentObjectEntry) == 0) { groups[groupsIndex].Add(currentObjectEntry.inputObject); isCurrentItemGrouped = true; break; } } if (!isCurrentItemGrouped) { // create a new group s_tracer.WriteLine("Create a new group: {0}", currentObjectEntry.orderValues); GroupInfo newObjGrp = noElement ? new GroupInfoNoElement(currentObjectEntry) : new GroupInfo(currentObjectEntry); groups.Add(newObjGrp); groupInfoDictionary.Add(currentTupleObject, newObjGrp); } } } }