/// <summary> /// 是否空集合 /// </summary> /// <returns>是否空集合</returns> public unsafe bool IsEmpty() { fixed(range *indexFixed = indexs) { for (range *index = indexFixed + indexs.Length; index != indexFixed;) { --index; if ((*index).StartIndex != (*index).EndIndex) { return(false); } } } return(true); }
/// <summary> /// 获取匹配的数据集合 /// </summary> /// <typeparam name="listType">目标数据类型</typeparam> /// <param name="getValue">数据转换器</param> /// <returns>匹配的数据集合</returns> protected unsafe list <listType> getList <listType>(func <valueType, listType> getValue) { list <listType> .unsafer values = new list <listType>(array.Length).Unsafer; fixed(range *indexFixed = indexs) { for (range *index = indexFixed + indexs.Length; index != indexFixed;) { for (range range = *--index; range.StartIndex != range.EndIndex; ++range.StartIndex) { values.Add(getValue(array[range.StartIndex])); } } } return(values.List); }
/// <summary> /// 数据转换成单向动态数组 /// </summary> /// <returns>单向动态数组</returns> public unsafe list <valueType> GetList() { list <valueType> .unsafer values = new list <valueType>(array.Length).Unsafer; fixed(range *indexFixed = indexs) { for (range *index = indexFixed + indexs.Length; index != indexFixed;) { for (range range = *--index; range.StartIndex != range.EndIndex; ++range.StartIndex) { values.Add(array[range.StartIndex]); } } } return(values.List); }
/// <summary> /// 数据转换成单向动态数组 /// </summary> /// <returns>单向动态数组</returns> public unsafe subArray <valueType> GetList() { subArray <valueType> values = new subArray <valueType>(array.Length); fixed(range *indexFixed = indexs) { for (range *index = indexFixed + indexs.Length; index != indexFixed;) { for (range range = *--index; range.StartIndex != range.EndIndex; ++range.StartIndex) { values.UnsafeAdd(array[range.StartIndex]); } } } return(values); }
/// <summary> /// 获取匹配的数据集合 /// </summary> /// <typeparam name="listType">目标数据类型</typeparam> /// <param name="getValue">数据转换器</param> /// <returns>匹配的数据集合</returns> protected unsafe subArray <listType> getList <listType>(Func <valueType, listType> getValue) { subArray <listType> values = new subArray <listType>(array.Length); fixed(range *indexFixed = indexs) { for (range *index = indexFixed + indexs.Length; index != indexFixed;) { for (range range = *--index; range.StartIndex != range.EndIndex; ++range.StartIndex) { values.UnsafeAdd(getValue(array[range.StartIndex])); } } } return(values); }
/// <summary> /// 是否存在匹配数据 /// </summary> /// <param name="isValue">数据匹配器</param> /// <returns>是否存在匹配数据</returns> public unsafe bool IsExist(func <valueType, bool> isValue) { fixed(range *indexFixed = indexs) { for (range *index = indexFixed + indexs.Length; index != indexFixed;) { for (range range = *--index; range.StartIndex != range.EndIndex; ++range.StartIndex) { if (isValue(array[range.StartIndex])) { return(true); } } } } return(false); }
/// <summary> /// 获取匹配的数据集合 /// </summary> /// <param name="isValue">数据匹配器</param> /// <returns>匹配的数据集合</returns> protected unsafe subArray <valueType> getList(Func <valueType, bool> isValue) { subArray <valueType> values = new subArray <valueType>(array.Length); fixed(range *indexFixed = indexs) { for (range *index = indexFixed + indexs.Length; index != indexFixed;) { for (range range = *--index; range.StartIndex != range.EndIndex; ++range.StartIndex) { valueType value = array[range.StartIndex]; if (isValue(value)) { values.UnsafeAdd(value); } } } } return(values); }
/// <summary> /// 获取哈希数据数组 /// </summary> /// <typeparam name="valueType">数据类型</typeparam> /// <param name="values">数据集合</param> /// <param name="hashs">哈希集合</param> /// <returns>哈希数据数组</returns> protected unsafe valueType[] getValues <valueType>(valueType[] values, int *hashs) { int indexBits = ((uint)values.Length).bits(); if (indexBits < defaultArrayLengthBits) { indexBits = defaultArrayLengthBits; } else if ((1 << (indexBits - 1)) == values.Length) { --indexBits; } indexAnd = 1 << indexBits; indexs = new range[indexAnd--]; fixed(range *indexFixed = indexs) { for (int *hash = hashs + values.Length; hash != hashs; ++indexFixed[*--hash & indexAnd].StartIndex) { ; } int startIndex = 0; for (range *index = indexFixed, endIndex = indexFixed + indexAnd + 1; index != endIndex; ++index) { int nextIndex = startIndex + (*index).StartIndex; (*index).StartIndex = (*index).EndIndex = startIndex; startIndex = nextIndex; } valueType[] newValues = new valueType[values.Length]; foreach (valueType value in values) { newValues[indexFixed[*hashs++ & indexAnd].EndIndex++] = value; } //for (int index = 0; index != values.Length; newValues[indexFixed[*hashs++ & indexAnd].EndIndex++] = values[index++]) ; return(newValues); } }