public static EventBean[] Reorder( string[] keys, EventBean[] events) { var result = new EventBean[events.Length]; Array.Copy(events, 0, result, 0, result.Length); var mkcomparator = new ComparatorHashableMultiKey(new bool[keys.Length]); Array.Sort( result, ( o1, o2) => { var mk1 = GetMultiKey(o1, keys); var mk2 = GetMultiKey(o2, keys); return mkcomparator.Compare(mk1, mk2); }); return result; }
/// <summary> /// NOTE: Code-generation-invoked method, method name and parameter order matters /// </summary> /// <param name="sortCriteriaTypes">types</param> /// <param name="isSortUsingCollator">flag</param> /// <param name="isDescendingValues">flags</param> /// <returns>comparator</returns> public static IComparer<object> GetComparatorHashableMultiKeys( Type[] sortCriteriaTypes, bool isSortUsingCollator, bool[] isDescendingValues) { // determine string-type sorting bool hasStringTypes = false; bool[] stringTypes = new bool[sortCriteriaTypes.Length]; int count = 0; for (int i = 0; i < sortCriteriaTypes.Length; i++) { if (sortCriteriaTypes[i] == typeof(string)) { hasStringTypes = true; stringTypes[count] = true; } count++; } if (sortCriteriaTypes.Length > 1) { if ((!hasStringTypes) || (!isSortUsingCollator)) { ComparatorHashableMultiKey comparatorMK = new ComparatorHashableMultiKey(isDescendingValues); return new ComparatorHashableMultiKeyCasting(comparatorMK); } else { ComparatorHashableMultiKeyCollating comparatorMk = new ComparatorHashableMultiKeyCollating(isDescendingValues, stringTypes); return new ComparatorHashableMultiKeyCasting(comparatorMk); } } else { if ((!hasStringTypes) || (!isSortUsingCollator)) { return new ObjectComparator(isDescendingValues[0]); } else { return new ObjectCollatingComparator(isDescendingValues[0]); } } }