本帖最后由 Kennytian 于 2010-12-21 23:50:34 编辑

解决方案 »

  1.   

    上面的问题已经解决,现在求一个C#算法问题
    81,82,83,86,87,89,100-103,104,105,106,107  ->   81-83,86,87,89,100-103,104-107我自己现在正在写,我已经觉得有很多冗余代码了,所以想学习下各位高手的代码,请不吝赐教!
      

  2.   


    static public string KunBaby()
            {
                //此处我假设为一个字符串,号段压缩的时候,可以是HashTable,SortedList或者ArrayList
                string exitNum = "81,82,83,86,87,100-103,105,106,107,108-120";
                string[] arrNum = null;
                string result = String.Empty;            int startNum = 0;
                int endNum = 0;
                int newNum = 0;            //using System.Text.RegularExpressions;
                string strReg = @"\d+";
                Regex regCond = new Regex(strReg);            //using System.Collections;
                //我用SortedList的理由 :1 比较好查询;2 不用我排序; 3 适应exitNum中的号段顺序混乱、重复的可能
                SortedList sl = new SortedList();            foreach (string strNum in exitNum.Split(','))
                {
                    if (strNum.Contains("—") || strNum.Contains("-"))
                    {
                        arrNum = strNum.Replace("—", "-").Split('-');
                        if ((arrNum.Length != 2) || (!regCond.IsMatch(arrNum[0].Trim())) || (!regCond.IsMatch(arrNum[1].Trim())))
                        {
                            continue;
                        }                    startNum = Convert.ToInt32(arrNum[0].Trim());
                        endNum = Convert.ToInt32(arrNum[1].Trim());                    for (int i = 0; i <= endNum - startNum; i++)
                        {
                            newNum = startNum + i;
                            //在此处先判断是否是数字,便于后面处理
                            if (!sl.Contains(newNum.ToString().PadLeft(15, '0')))
                            {
                                sl.Add(newNum.ToString().PadLeft(15, '0'), newNum.ToString());
                            }
                        }
                    }
                    else
                    {
                        //在此处先判断是否是数字,便于后面处理
                        if ((regCond.IsMatch(strNum.Trim())) && (!sl.Contains(strNum.ToString().PadLeft(15, '0'))))
                        {
                            sl.Add(strNum.ToString().PadLeft(15, '0'), strNum);
                        }
                    }
                }            result = CompressData(sl);            return result;
            }
      

  3.   


            static public string CompressData(SortedList sl)
            {
                string compressResult = String.Empty;
                int startNum = 0;
                int endNum = 0;
                int addCount = 1;            //在不考虑类似测试号段之类号段超长的情况下
                startNum = Convert.ToInt32(sl.GetKey(0).ToString());            for (int i = 1; i <= sl.Count; i++)
                {
                    if (i == sl.Count)
                    {
                        compressResult += "," + startNum + "-" + sl[sl.GetKey(i - 1).ToString()].ToString();
                        break;
                    }                endNum = Convert.ToInt32(sl.GetKey(i).ToString());                if ((startNum + addCount) == endNum)
                    {
                        addCount++;
                        continue;
                    }
                    else
                    {
                        if (addCount == 1)
                        {
                            compressResult += "," + startNum;
                            startNum = Convert.ToInt32(sl.GetKey(i).ToString());
                        }
                        else
                        {
                            compressResult += "," + startNum + "-" + sl[sl.GetKey(i - 1).ToString()].ToString();
                            startNum = Convert.ToInt32(sl.GetKey(i).ToString());
                        }                    addCount = 1;
                    }
                }            if (!String.IsNullOrEmpty(compressResult))
                {
                    compressResult = compressResult.Substring(1);
                }            return compressResult;
            }
      

  4.   

    嗯~上面那段忘了为空或只有一个数的情况,下面这个是修改后的CompressData方法:
    static public string CompressData(SortedList sl)
            {
                string compressResult = String.Empty;
                int startNum = 0;
                int endNum = 0;
                int addCount = 1;            //在不考虑类似测试号段之类号段超长的情况下
                if (sl.Count == 0)
                {
                    return compressResult;
                }
                else if (sl.Count == 1)
                {
                    compressResult = sl[sl.GetKey(0).ToString()].ToString();
                    return compressResult;
                }            startNum = Convert.ToInt32(sl.GetKey(0).ToString());            for (int i = 1; i <= sl.Count; i++)
                {
                    if (i == sl.Count)
                    {
                        compressResult += "," + startNum + "-" + sl[sl.GetKey(i - 1).ToString()].ToString();
                        break;
                    }                endNum = Convert.ToInt32(sl.GetKey(i).ToString());                if ((startNum + addCount) == endNum)
                    {
                        addCount++;
                        continue;
                    }
                    else
                    {
                        if (addCount == 1)
                        {
                            compressResult += "," + startNum;
                            startNum = Convert.ToInt32(sl.GetKey(i).ToString());
                        }
                        else
                        {
                            compressResult += "," + startNum + "-" + sl[sl.GetKey(i - 1).ToString()].ToString();
                            startNum = Convert.ToInt32(sl.GetKey(i).ToString());
                        }                    addCount = 1;
                    }
                }            if (!String.IsNullOrEmpty(compressResult))
                {
                    compressResult = compressResult.Substring(1);
                }            return compressResult;
            }