C#是否内置支持解析页码字符串?通过页码,我的意思是您可以在打印对话框中输入的格式,该对话框是逗号和划线分隔的混合.
像这样的东西:
1,3,5-10,12
Run Code Online (Sandbox Code Playgroud)
真正好的是一个解决方案,它给了我一些由字符串表示的所有页码的列表.在上面的例子中,像这样返回一个列表会很好:
1,3,5,6,7,8,9,10,12
Run Code Online (Sandbox Code Playgroud)
如果有一个简单的方法,我只想避免自己滚动.
Kei*_*ith 22
应该很简单:
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;
}
}
}
Run Code Online (Sandbox Code Playgroud)
编辑:谢谢你的修复;-)
它没有内置的方法来执行此操作,但使用String.Split会很简单.
只需拆分','即可获得一系列表示页码或范围的字符串.迭代该系列并执行String.Split' - '.如果没有结果,那么它是一个普通页码,所以请将其粘贴在您的页面列表中.如果有结果,请将' - '的左侧和右侧作为边界,并使用简单的for循环将每个页码添加到该范围内的最终列表中.
不能花5分钟做,然后可能另外10个添加一些健全性检查以在用户尝试输入无效数据时抛出错误(如"1-2-3"或其他东西.)
基思的方法看起来不错.我使用列表组合了一种更天真的方法.这有错误检查所以希望能解决大多数问题: -
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));
}
Run Code Online (Sandbox Code Playgroud)
下面是我刚刚编写的代码。您可以输入以下格式:1-2,5abcd,6,7,20-15,,,,,,
易于添加其他格式
private int[] ParseRange(string ranges)
{
string[] groups = ranges.Split(',');
return groups.SelectMany(t => GetRangeNumbers(t)).ToArray();
}
private int[] GetRangeNumbers(string range)
{
//string justNumbers = new String(text.Where(Char.IsDigit).ToArray());
int[] RangeNums = range
.Split('-')
.Select(t => new String(t.Where(Char.IsDigit).ToArray())) // Digits Only
.Where(t => !string.IsNullOrWhiteSpace(t)) // Only if has a value
.Select(t => int.Parse(t)) // digit to int
.ToArray();
return RangeNums.Length.Equals(2) ? Enumerable.Range(RangeNums.Min(), (RangeNums.Max() + 1) - RangeNums.Min()).ToArray() : RangeNums;
}
Run Code Online (Sandbox Code Playgroud)