当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《C#是否内置支持解析页码字符串?》经验,为你挑选了3个好方法。

C#是否内置支持解析页码字符串?通过页码,我的意思是您可以在打印对话框中输入的格式,该对话框是逗号和划线分隔的混合.

像这样的东西:

1,3,5-10,12

真正好的是一个解决方案,它给了我一些由字符串表示的所有页码的列表.在上面的例子中,像这样返回一个列表会很好:

1,3,5,6,7,8,9,10,12

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



1> Keith..:

应该很简单:

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;
        }
    }
}

编辑:谢谢你的修复;-)



2> Daniel Jenni..:

它没有内置的方法来执行此操作,但使用String.Split会很简单.

只需拆分','即可获得一系列表示页码或范围的字符串.迭代该系列并执行String.Split' - '.如果没有结果,那么它是一个普通页码,所以请将其粘贴在您的页面列表中.如果有结果,请将' - '的左侧和右侧作为边界,并使用简单的for循环将每个页码添加到该范围内的最终列表中.

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



3> ljs..:

基思的方法看起来不错.我使用列表组合了一种更天真的方法.这有错误检查所以希望能解决大多数问题: -

public List parsePageNumbers(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));
}

推荐阅读
手机用户2402852307
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有