首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C#是否具有解析页码字符串的内置支持?

C#是否具有解析页码字符串的内置支持?
EN

Stack Overflow用户
提问于 2008-09-02 17:53:54
回答 11查看 7.8K关注 0票数 20

C#对解析页码字符串有内置支持吗?对于页码,我指的是您可能在打印对话框中输入的格式,该格式由逗号和破折号分隔。

如下所示:

代码语言:javascript
运行
复制
1,3,5-10,12

最好的解决方案是返回一个由字符串表示的所有页码的列表。在上面的例子中,像这样得到一个列表会很好:

代码语言:javascript
运行
复制
1,3,5,6,7,8,9,10,12

我只想避免滚动我自己的,如果有一个简单的方法。

EN

回答 11

Stack Overflow用户

回答已采纳

发布于 2008-09-02 18:07:14

应该很简单:

代码语言:javascript
运行
复制
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;
        }
    }
}

编辑:感谢您的修复;-)

票数 25
EN

Stack Overflow用户

发布于 2008-09-02 17:55:53

它没有内置的方法来做这件事,但是使用String.Split做这件事是很容易的。

只需在“,”上拆分,就可以得到一系列表示页码或范围的字符串。遍历该系列并执行'-‘的String.Split。如果没有结果,它是一个普通的页码,所以把它放在你的页码列表中。如果有结果,以'-‘的左边和右边为界限,并使用一个简单的for循环将每个页码添加到该范围内的最终列表中。

不能只花5分钟,然后可能需要另外10分钟来添加一些健全性检查,以便在用户尝试输入无效数据(如"1-2-3“或其他)时抛出错误。

票数 9
EN

Stack Overflow用户

发布于 2008-09-02 18:26:09

Keith的方法看起来不错。我使用列表组合了一种更天真的方法。这有错误检查,所以希望能发现大多数问题:

代码语言:javascript
运行
复制
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));
}
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40161

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档