C#是否内置支持解析页码字符串?通过页码,我的意思是您可以在打印对话框中输入的格式,该对话框是逗号和划线分隔的混合.
像这样的东西:
1,3,5-10,12
真正好的是一个解决方案,它给了我一些由字符串表示的所有页码的列表.在上面的例子中,像这样返回一个列表会很好:
1,3,5,6,7,8,9,10,12
如果有一个简单的方法,我只想避免自己滚动.
应该很简单:
foreach( string s in "1,3,5-10,12".Split(',') ) { // try and get the number int num; if( int.TryParse( s, out num ) ) { yield return num; continue; // skip the rest } // otherwise we might have a range // split on the range delimiter string[] subs = s.Split('-'); int start, end; // now see if we can parse a start and end if( subs.Length > 1 && int.TryParse(subs[0], out start) && int.TryParse(subs[1], out end) && end >= start ) { // create a range between the two values int rangeLength = end - start + 1; foreach(int i in Enumerable.Range(start, rangeLength)) { yield return i; } } }
编辑:谢谢你的修复;-)
它没有内置的方法来执行此操作,但使用String.Split会很简单.
只需拆分','即可获得一系列表示页码或范围的字符串.迭代该系列并执行String.Split' - '.如果没有结果,那么它是一个普通页码,所以请将其粘贴在您的页面列表中.如果有结果,请将' - '的左侧和右侧作为边界,并使用简单的for循环将每个页码添加到该范围内的最终列表中.
不能花5分钟做,然后可能另外10个添加一些健全性检查以在用户尝试输入无效数据时抛出错误(如"1-2-3"或其他东西.)
基思的方法看起来不错.我使用列表组合了一种更天真的方法.这有错误检查所以希望能解决大多数问题: -
public ListparsePageNumbers(string input) { if (string.IsNullOrEmpty(input)) throw new InvalidOperationException("Input string is empty."); var pageNos = input.Split(','); var ret = new List (); foreach(string pageString in pageNos) { if (pageString.Contains("-")) { parsePageRange(ret, pageString); } else { ret.Add(parsePageNumber(pageString)); } } ret.Sort(); return ret.Distinct().ToList(); } private int parsePageNumber(string pageString) { int ret; if (!int.TryParse(pageString, out ret)) { throw new InvalidOperationException( string.Format("Page number '{0}' is not valid.", pageString)); } return ret; } private void parsePageRange(List pageNumbers, string pageNo) { var pageRange = pageNo.Split('-'); if (pageRange.Length != 2) throw new InvalidOperationException( string.Format("Page range '{0}' is not valid.", pageNo)); int startPage = parsePageNumber(pageRange[0]), endPage = parsePageNumber(pageRange[1]); if (startPage > endPage) { throw new InvalidOperationException( string.Format("Page number {0} is greater than page number {1}" + " in page range '{2}'", startPage, endPage, pageNo)); } pageNumbers.AddRange(Enumerable.Range(startPage, endPage - startPage + 1)); }