/// <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); }
/// <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); } }
/// <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); }
/// <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); }