Example #1
0
        /// <summary>
        /// 指定集合的起始值与结束值,与最大值和最小值进行比较并返回符合限制范围内的实体信息(如果起始值或结束值超出限制范围,则该值自动取最小值或最大值)
        /// </summary>
        public static RangeValueEntity GetRangeValueEntity(int startValue, int endValue, int minValue, int maxValue)
        {
            //不符合比较条件
            if (startValue > endValue || minValue > maxValue)
            {
                return(null);
            }

            //完全无交集
            if ((startValue < minValue && endValue < minValue) || (startValue > maxValue && endValue > maxValue))
            {
                return(null);
            }

            //纠正临界值
            if (startValue < minValue)
            {
                startValue = minValue;
            }
            if (startValue > maxValue)
            {
                startValue = maxValue;
            }
            if (endValue < minValue)
            {
                endValue = minValue;
            }
            if (endValue > maxValue)
            {
                endValue = maxValue;
            }

            var result = new RangeValueEntity();

            result.StartValue = startValue;
            result.EndValue   = endValue;
            return(result);
        }
Example #2
0
        /// <summary>
        /// 将范围文本字符串解析为实体列表,并且自动将倒数的数字转为正数的数字,文本的格式如下:
        /// 【1】表示第1项,【2】表示第2项,【2:5】表示第2项到第5项,【-1】表示最后一项,【-2】表示倒数第2项,【-5:-2】表示倒数第5项到倒数第2项,【2,4:7,-5:-2】表示第2项和第4到7项和倒数第5项至倒数第2项
        /// </summary>
        /// <param name="str">范围字符串</param>
        /// <param name="minValue">最小值限制</param>
        /// <param name="maxValue">最大值限制</param>
        /// <param name="isNeedOptimize">是否需要优化处理后的结果(去重+合并有交叉的范围)</param>
        public static List <RangeValueEntity> GetRangeValueEntityListFromText(string str, int minValue, int maxValue, bool isNeedOptimize = false)
        {
            str = str?.Replace(',', ',').Replace(':', ':').Trim().Trim(',');

            var lst = new List <RangeValueEntity>();

            if (string.IsNullOrWhiteSpace(str))
            {
                return(lst);
            }

            //开始解析
            str = new Regex(@"\s+").Replace(str, "");
            str.Split(',').ToList().ForEach(item =>
            {
                var arr = item.Split(':');
                if (arr.Length > 2)
                {
                    return;
                }
                var model = new RangeValueEntity();
                if (arr.Length == 1)
                {
                    model.StartValue = XCLNetTools.Common.DataTypeConvert.ToInt(arr[0]);
                    model.EndValue   = model.StartValue;
                }
                if (arr.Length == 2)
                {
                    model.StartValue = XCLNetTools.Common.DataTypeConvert.ToInt(arr[0]);
                    model.EndValue   = XCLNetTools.Common.DataTypeConvert.ToInt(arr[1]);
                }
                if (model.StartValue == 0 || model.EndValue == 0)
                {
                    return;
                }
                //将负数转成正数
                if (model.StartValue < 0)
                {
                    model.StartValue = maxValue + model.StartValue + 1;
                }
                if (model.EndValue < 0)
                {
                    model.EndValue = maxValue + model.EndValue + 1;
                }
                model = Common.GetRangeValueEntity(model.StartValue, model.EndValue, minValue, maxValue);
                if (null == model)
                {
                    return;
                }
                lst.Add(model);
            });

            if (lst.IsNullOrEmpty())
            {
                return(lst);
            }

            //优化集合范围列表,比如范围中有两个值:2到5、3到6,则最终会合并成:2到6
            if (isNeedOptimize)
            {
                var indexLst = new List <int>();
                lst.ForEach(k =>
                {
                    for (var i = k.StartValue; i <= k.EndValue; i++)
                    {
                        indexLst.Add(i);
                    }
                });
                indexLst = indexLst.Distinct().OrderBy(k => k).ToList();//此时会得到已去重且按升序排列的纯数字:[1,2,3,6,7,8,9,10,22,100]
                var result = new List <RangeValueEntity>();
                result.Add(new RangeValueEntity()
                {
                    StartValue = indexLst[0],
                    EndValue   = indexLst[0]
                });
                if (indexLst.Count >= 2)
                {
                    for (var i = 1; i < indexLst.Count; i++)
                    {
                        var currentIndex = indexLst[i];
                        var lastItem     = result.Last();
                        if (currentIndex == lastItem.EndValue + 1)
                        {
                            lastItem.EndValue = currentIndex;
                            continue;
                        }
                        var model = new RangeValueEntity();
                        model.StartValue = currentIndex;
                        model.EndValue   = currentIndex;
                        result.Add(model);
                    }
                }
                return(result);
            }

            return(lst);
        }