C# 在一定数量的字符和换行后拆分字符串。在C中#

C# 在一定数量的字符和换行后拆分字符串。在C中#,c#,string,substring,C#,String,Substring,背景:我将获取大字符串(500-5000个字符)并将它们放入PPTX文件中。我的幻灯片只有足够的空间容纳大约1000个字符。我想在幻灯片已满后拆分文本,然后继续下一张幻灯片。据我所知,如果文本已经在幻灯片/文本框之外,就没有办法(非常确定)检查幻灯片(我使用的是“OpenXMLSDK结合”OpenXMLPowerTools) 到目前为止的处理过程:我成功地编写了一个方法,在maxLength小于1000个字符时(正如子字符串(startIndex,maxLength))在恰好1000个字符后拆分

背景:我将获取大字符串(500-5000个字符)并将它们放入PPTX文件中。我的幻灯片只有足够的空间容纳大约1000个字符。我想在幻灯片已满后拆分文本,然后继续下一张幻灯片。据我所知,如果文本已经在幻灯片/文本框之外,就没有办法(非常确定)检查幻灯片(我使用的是“OpenXMLSDK结合”OpenXMLPowerTools)

到目前为止的处理过程:我成功地编写了一个方法,在maxLength小于1000个字符时(正如子字符串(startIndex,maxLength))在恰好1000个字符后拆分字符串,而不会触发错误。这是我的截断方法:

public static string Truncate(string text, int startIndex, int maxLength)
        {

            if (string.IsNullOrEmpty(text)) return text;
            if (text.Length > startIndex + maxLength)
            {
                return text.Substring(startIndex, maxLength) + "-";
            }
            return text.Substring(startIndex);
        }
问题:现在的问题是一些字符串有很多换行符,而其他字符串很少或没有换行符。这导致一些字符串需要很大的高度,并且非常大,无法放入幻灯片

可能的想法:我考虑通过计算换行符来估计字符串高度,并在每个换行符的字符数中添加30个字符。这提供了更精确的近似值。(满字符的行通常包含大约50个字符,但有时换行符在中间行,所以我认为+ 30个字符是一个很好的猜测)。这是我的方法:

public int CountCharacters(string text)
{
    var numLines = text.Length;
    numLines += (text.Split('\n').Length) * 30;
    return numLines;
}

结果问题:考虑到换行符,在达到1000之后,我现在如何组合这些方法来拆分字符串?或者这毕竟是错误的方法吗?

您可以测量字符串,并确定所需的空间。请记住字体是一个因素,因此如果使用多个字体,则需要执行多个ca计算


像这样的东西怎么样:

        string test; //your input string
        int j;  //variable that holds the slide content length
        int max_lines = 10;  //desired maximum amount of lines per slide
        int max_characters = 1000; //desired maximum amount of characters
        char[] input = test.ToCharArray();  //convert input string into an array of characters
        string slide_content;    //variable that will hold the output of each single slide

        while (input.Length > 0)
        {
            //reset slide content and length
            slide_content = string.Empty;
            j = 0;

            //loop through the input string and get a 'j' amount of characters
            while ((slide_content.Split('\n').Length < max_lines) && (j < max_characters))
            {
                j = j + 1;
                slide_content = new string(input.Take(j).ToArray());
            }

            //Output slide content
            Console.WriteLine(slide_content);
            Console.WriteLine("=================== END OF THE SLIDE =====================");          

            //Remove the previous slide content from the input string
            input = input.Skip(j).ToArray();       
        }

        Console.Read();
string test;//您的输入字符串
int j;//保存幻灯片内容长度的变量
int max_lines=10;//每张幻灯片所需的最大行数
int max_characters=1000;//所需的最大字符数
char[]input=test.ToCharArray();//将输入字符串转换为字符数组
string slide_content;//保存每个幻灯片输出的变量
while(input.Length>0)
{
//重置幻灯片内容和长度
幻灯片内容=字符串。空;
j=0;
//循环输入字符串并获得“j”个字符数
while((幻灯片内容分割('\n')。长度<最大行数)和&(j<最大字符数))
{
j=j+1;
幻灯片内容=新字符串(input.Take(j.ToArray());
}
//输出幻灯片内容
Console.WriteLine(幻灯片内容);
Console.WriteLine(“===============================================================================”);
//从输入字符串中删除上一张幻灯片的内容
input=input.Skip(j).ToArray();
}
Console.Read();

我认为您最好只是手动计算truncate函数中的换行数。这些拆分调用并不便宜,您使用它们的目的只是计算换行数。以下是我的尝试(CHARS\u PER\u NEWLINE是一个全局常量,对应于您建议的30):

公共静态字符串截断(字符串文本,int-startIndex,int-maxLength)
{
if(string.IsNullOrEmpty(text))返回文本;
剩余整数=最大长度;
int索引=startIndex;

虽然(剩余>0&&INDEX我不确定这是否对您有帮助,但是
Split
方法中有一个选项可以指定返回多少子字符串:我想知道使用是否有帮助?我不确定它是否处理新行。@Meghan我需要定义一个字符作为拆分正确的点?例如空格.T然后,我可以使用CountCharacters方法返回值除以1000来找到我需要的拆分数目。但是,我不知道如何定义将使用哪个空格来进行拆分。我想只需要第一个空格。让我们看看,我会做我的研究。感谢您的贡献!while条件不是很好吗喜欢
(幻灯片内容。拆分('\n')。长度+j/50
这样,我总是以max\u行作为行数。(假设整行由约50个字符组成)?但非常感谢!我觉得我会在我的项目中包括你的方法。一旦它像预期的那样工作,我会将它标记为答案!作为奖励,我编辑了while循环,以便它只在空白处分割当前文本,或者如果在最后两行有换行符。这会使程序稍微慢一点,但结果是非常好的format.
while(slide_-content.Split('\n').Length+j/50max| input[j]='\n')){break;}
@Tobias Mayr,是的,我同意可能需要进行一些编辑,我确信我没有为您的问题提供有效的解决方案,而是提供一种不同的方法,您可以从中获得想法或适应您的意愿。这听起来是一种非常优雅和精确的解决方案。但是,我对这一问题缺乏了解。您认为我可以将宽度与d我的pptx幻灯片的高度,并使用它来计算我的文本框何时会满(给定字体大小等)?我必须在内部创建一个矩形来测量它是否正确?也许你可以给我提示一下!谢谢!我知道这可以工作,我用它来绘制列表框控件。高度是固定的(考虑到掉落的jg字母)。当您认为自己已接近极限时,Use可以为其提供一组字符,以获得良好的平均字母宽度或测量值。
public static string Truncate(string text, int startIndex, int maxLength)
    {

        if (string.IsNullOrEmpty(text)) return text;
        int remaining = maxLength;
        int index = startIndex;
        while (remaining > 0 && index<text.Length)
        {
            if (text[index] == '\n')
            {
                remaining -= CHARS_PER_NEWLINE;
            }
            else
            {
                remaining--;
            }
            index++;
        }
        return text.Substring(startIndex, index - startIndex) + '-';
    }