예제 #1
0
 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;
 }
예제 #2
0
        /// <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]);
                }
            }
        }