解决方案 »
- 请问:用Windows命令行如何检查Windows系统补丁(KBxxxxxx)的最后一次安装时间?
- C#绘制欧姆表类似于手表盘的图形,怎么设计啊?急急急
- [分享]中缀表达式转前缀后缀表达式以及求值
- 如何控制小数位数
- 如何把多个表中的一些字段提取出来放到一个datagridview
- VS2005 编译问题,100分求解
- 如何让该窗体不可用?
- 【listview问题】想在listview里添加两列,然后在每列中添加一些数据,该怎么做。。
- 请教一个SqlParameter.Direction的问题
- 请大家告诉我,我的 WebService 已经做好,也用asp.net做了个调用它的 WebSite,数据库我用的是ms SQL ,我想确实的投入运行了,要怎么弄
- C#中的数据访问
- 在事件里调用DLL函数?
81,82,83,86,87,89,100-103,104,105,106,107 -> 81-83,86,87,89,100-103,104-107我自己现在正在写,我已经觉得有很多冗余代码了,所以想学习下各位高手的代码,请不吝赐教!
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;
}
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;
}
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;
}