c# - 使用 Page X/Y 计算每行字符串的正确长度

标签 c# data-paging

我被问到了一个问题,现在我因为无法得出准确/正确的结果而自责。

假设我们有一个函数,可以将字符串拆分为多行,但在我们“拆分”到新行之前,每行必须有 x 个字符:

private string[] GetPagedMessages(string input, int maxCharsPerLine) { ... }

对于每一行,我们需要在行的末尾添加“x/y”,它基本上是 1/4、2/4 等... 现在,分页机制也必须是每行长度限制的一部分。

我一直过度劳累、过度思考、在事情上绊倒,这看起来很简单,但对于我的生活来说,我无法弄清楚!我没有“得到”什么?

我对什么感兴趣?计算和部分逻辑,但主要是计算根据每行的最大字符数分割输入需要多少行,还需要包括 x/y。

请记住:x/y 可以有多个数字(即:不仅是 1/4,还可以是 10/17 或 99/200)

示例:

input =“这是一条很长的消息”

每行最大字符数 = 10

输出:

This i 1/4 // << Max 10 chars
s a lo 2/4 // << Max 10 chars
ng mes 3/4 // << Max 10 chars
sage 4/4 // << Max 10 chars

总的来说,逻辑很简单,但只是计算让我失望。

最佳答案

思路:首先求行数是多少位:

(n = input.Length, maxCharsPerLine = 10)
if n <= 9*(10-4)  ==> 1 digit
if n <= 9*(10-5) + 90*(10-6)  ==> 2 digits
if n <= 9*(10-6) + 90*(10-7) + 900*(10-8)  ==> 3 digits
if n <= 9*(10-7) + 90*(10-8) + 900*(10-9) + 9000*(10-10)  ==> No solution

然后,减去多余的行数。解决办法:

    private static int GetNumberOfLines(string input, int maxCharsPerLine)
    {
        int n = input.Length;
        int x = maxCharsPerLine;

        for (int i = 4; i < x; i++)
        {
            int j, sum = 0, d = 9, numberOfLines = 0;

            for (j = i; j <= i + i - 4; j++)
            {
                if (x - j <= 0)
                    return -1;   // No solution

                sum += d * (x - j);
                numberOfLines += d;
                d *= 10;
            }
            if (n <= sum)
                return numberOfLines - (sum - n) / (x - j + 1);
        }
        return -2;   // Invalid
    }

用法:

    private static string[] GetPagedMessages(string input, int maxCharsPerLine)
    {
        int numberOfLines = GetNumberOfLines(input, maxCharsPerLine);
        if (numberOfLines < 0)
            return null;

        string[] result = new string[numberOfLines];

        int spaceLeftForLine = maxCharsPerLine - numberOfLines.ToString().Length - 2;  // Remove the chars of " x/y" except the incremental 'x'
        int inputPosition = 0;
        for (int line = 1; line < numberOfLines; line++)
        {
            int charsInLine = spaceLeftForLine - line.ToString().Length;
            result[line - 1] = input.Substring(inputPosition, charsInLine) + $" {line}/{numberOfLines}";
            inputPosition += charsInLine;
        }
        result[numberOfLines-1] = input.Substring(inputPosition) + $" {numberOfLines}/{numberOfLines}";
        return result;
    }

关于c# - 使用 Page X/Y 计算每行字符串的正确长度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65934651/

相关文章:

sql-server - 是否可以在恒定时间内在 SQL Server (2012) 中进行数据分页?

sql - 带有 OFFSET 的总行数 .. FETCH 问题

c# - 如何使用 QueryOver 编辑 NHibernate Junction?

c# - 无需授权或用户登录即可保护 webapi 2

c# - 将类型定义为类型的超集

c# - 无法加载 WCF 服务中的相关实体

c# - C#中使用字符串调用变量

sql-server-2005 - 帮助 !如何从我的 SQL Server 分页过程中获取总行数?

sql-server-ce - SQL Server CE(精简版)中的数据分页

c# - 使用分页获取大量数据