C#对解析页码字符串有内置支持吗?对于页码,我指的是您可能在打印对话框中输入的格式,该格式由逗号和破折号分隔。
如下所示:
1,3,5-10,12最好的解决方案是返回一个由字符串表示的所有页码的列表。在上面的例子中,像这样得到一个列表会很好:
1,3,5,6,7,8,9,10,12我只想避免滚动我自己的,如果有一个简单的方法。
发布于 2008-09-02 18:07:14
应该很简单:
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;
}
}
}编辑:感谢您的修复;-)
发布于 2008-09-02 17:55:53
它没有内置的方法来做这件事,但是使用String.Split做这件事是很容易的。
只需在“,”上拆分,就可以得到一系列表示页码或范围的字符串。遍历该系列并执行'-‘的String.Split。如果没有结果,它是一个普通的页码,所以把它放在你的页码列表中。如果有结果,以'-‘的左边和右边为界限,并使用一个简单的for循环将每个页码添加到该范围内的最终列表中。
不能只花5分钟,然后可能需要另外10分钟来添加一些健全性检查,以便在用户尝试输入无效数据(如"1-2-3“或其他)时抛出错误。
发布于 2008-09-02 18:26:09
Keith的方法看起来不错。我使用列表组合了一种更天真的方法。这有错误检查,所以希望能发现大多数问题:
public List<int> parsePageNumbers(string input) {
if (string.IsNullOrEmpty(input))
throw new InvalidOperationException("Input string is empty.");
var pageNos = input.Split(',');
var ret = new List<int>();
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<int> 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));
}https://stackoverflow.com/questions/40161
复制相似问题