コード例 #1
0
            /// <summary>
            /// 根据数组获取排序索引
            /// </summary>
            /// <typeparam name="valueType">数组类型</typeparam>
            /// <param name="values">数组</param>
            /// <param name="getValue">数据排序值获取器</param>
            /// <returns>排序索引</returns>
            public unsafe static /*Type[1]*/     ulongSortIndex /*Type[1]*/[] Get <valueType>(valueType[] values, func <valueType, /*Type[0]*/ ulong /*Type[0]*/> getValue)
            {
                if (values.length() != 0)
                {
                    if (getValue == null)
                    {
                        log.Default.Throw(log.exceptionType.Null);
                    }
                    /*Type[1]*/
                    ulongSortIndex /*Type[1]*/[] indexs = new /*Type[1]*/ ulongSortIndex /*Type[1]*/[values.Length];
                    fixed(/*Type[1]*/ ulongSortIndex /*Type[1]*/ *indexFixed = indexs)
                    {
                        /*Type[1]*/
                        ulongSortIndex /*Type[1]*/ *write = indexFixed;

                        for (int index = 0; index != values.Length; ++index)
                        {
                            (*write).Value = getValue(values[index]);
                            (*write).Index = index;
                            ++write;
                        }
                    }

                    return(indexs);
                }
                return(nullValue </*Type[1]*/ ulongSortIndex /*Type[1]*/> .Array);
            }
コード例 #2
0
        /// <summary>
        /// 数组排序
        /// </summary>
        /// <typeparam name="valueType">数据类型</typeparam>
        /// <param name="values">待排序数组</param>
        /// <param name="getKey">排序键值获取器</param>
        /// <param name="startIndex">起始位置</param>
        /// <param name="count">排序数据数量</param>
        /// <param name="fixedIndex">索引位置</param>
        /// <returns>排序后的数组</returns>
        private unsafe static valueType[] getSort/*Compare[0]*//*Compare[0]*/ <valueType>
            (valueType[] values, func <valueType, /*Type[0]*/ ulong /*Type[0]*/> getKey, int startIndex, int count
            , /*Type[1]*/ ulongSortIndex /*Type[1]*/ *fixedIndex)
        {
            /*Type[1]*/
            ulongSortIndex /*Type[1]*/ *writeIndex = fixedIndex;

            if (count > 1)
            {
                if (getKey == null)
                {
                    log.Default.Throw(log.exceptionType.Null);
                }
                for (int index = startIndex, endIndex = startIndex + count; index != endIndex; ++index)
                {
                    *writeIndex++ = new /*Type[1]*/ ulongSortIndex /*Type[1]*/ {
                        Value = getKey(values[index]), Index = index
                    };
                }
                sort/*Compare[0]*//*Compare[0]*/ (writeIndex = fixedIndex, fixedIndex + count - 1);
            }
            else
            {
                *fixedIndex = new /*Type[1]*/ ulongSortIndex /*Type[1]*/ {
                    Index = startIndex
                }
            };
            valueType[] newValues = new valueType[count];
            for (int index = 0; index != newValues.Length; ++index)
            {
                newValues[index] = values[(*writeIndex++).Index];
            }
            return(newValues);
        }
    }
コード例 #3
0
 /// <summary>
 /// 数组排序
 /// </summary>
 /// <typeparam name="valueType">数据类型</typeparam>
 /// <param name="values">待排序数组</param>
 /// <param name="getKey">排序键值获取器</param>
 /// <returns>排序后的数组</returns>
 public unsafe static valueType[] GetSort/*Compare[0]*//*Compare[0]*/ <valueType>
     (valueType[] values, func <valueType, /*Type[0]*/ ulong /*Type[0]*/> getKey)
 {
     if (values.length() != 0)
     {
         if (values.Length > (config.pub.Default.StreamBufferLength >> 4))
         {
             /*Type[1]*/
             ulongSortIndex /*Type[1]*/[] indexs = new /*Type[1]*/ ulongSortIndex /*Type[1]*/[values.Length];
             fixed(/*Type[1]*/ ulongSortIndex /*Type[1]*/ *fixedIndex = indexs)
             {
                 return(getSort/*Compare[0]*//*Compare[0]*/ (values, getKey, fixedIndex));
             }
         }
         else
         {
             /*Type[1]*/
             ulongSortIndex /*Type[1]*/ *fixedIndex = stackalloc /*Type[1]*/ ulongSortIndex /*Type[1]*/[values.Length];
             return(getSort/*Compare[0]*//*Compare[0]*/ (values, getKey, fixedIndex));
         }
     }
     return(nullValue <valueType> .Array);
 }
コード例 #4
0
 /// <summary>
 /// 数组排序
 /// </summary>
 /// <typeparam name="valueType">数据类型</typeparam>
 /// <param name="values">待排序数组</param>
 /// <param name="getKey">排序键值获取器</param>
 /// <param name="startIndex">起始位置</param>
 /// <param name="count">排序数据数量</param>
 /// <returns>排序后的数组</returns>
 public unsafe static valueType[] GetSort/*Compare[0]*//*Compare[0]*/ <valueType>
     (valueType[] values, func <valueType, /*Type[0]*/ ulong /*Type[0]*/> getKey, int startIndex, int count)
 {
     array.range range = new array.range(values.length(), startIndex, count);
     if ((count = range.GetCount) != 0)
     {
         if (count > (config.pub.Default.StreamBufferLength >> 4))
         {
             /*Type[1]*/
             ulongSortIndex /*Type[1]*/[] indexs = new /*Type[1]*/ ulongSortIndex /*Type[1]*/[count];
             fixed(/*Type[1]*/ ulongSortIndex /*Type[1]*/ *fixedIndex = indexs)
             {
                 return(getSort/*Compare[0]*//*Compare[0]*/ (values, getKey, range.SkipCount, count, fixedIndex));
             }
         }
         else
         {
             /*Type[1]*/
             ulongSortIndex /*Type[1]*/ *fixedIndex = stackalloc /*Type[1]*/ ulongSortIndex /*Type[1]*/[count];
             return(getSort/*Compare[0]*//*Compare[0]*/ (values, getKey, range.SkipCount, count, fixedIndex));
         }
     }
     return(nullValue <valueType> .Array);
 }