将字符串按最大字符限制拆分

4
我试图将一个字符串分割成多个字符串(列表),每个字符串都有一个最大字符限制。例如,如果我有一个500个字符的字符串,并且我希望每个字符串的最大字符数为75,那么会有7个字符串,最后一个字符串不会有完整的75个字符。
我尝试了一些在stackoverflow上找到的示例,但它们会“截断”结果。有什么想法吗?

String类没有substring方法吗? - President James K. Polk
如果您提供几个测试用例来演示您所需的内容,那将对我很有帮助。 - Jay Bazuzi
6个回答

7
你可以编写自己的扩展方法来实现类似的功能。
static class StringExtensions
{
    public static IEnumerable<string> SplitOnLength(this string input, int length)
    {
        int index = 0;
        while (index < input.Length)
        {
            if (index + length < input.Length)
                yield return input.Substring(index, length);
            else
                yield return input.Substring(index);

            index += length;
        }
    }
}

然后你可以像这样调用它。
string temp = new string('@', 500);

string[] array = temp.SplitOnLength(75).ToArray();

foreach (string x in array)
    Console.WriteLine(x);

在你的字符串temp = new string('@', 500);中,'@'代表什么意思? 另外,我要分割的实际字符串参数放在哪里? - goodfella

2

我认为这个答案比其他答案更简洁:

    public static IEnumerable<string> SplitByLength(string s, int length)
    {
        while (s.Length > length)
        {
            yield return s.Substring(0, length);
            s = s.Substring(length);
        }

        if (s.Length > 0) yield return s;            
    }

1
我会使用C# String.Substring方法来循环处理这个问题。
请注意,这不是精确的代码,但你可以理解其中的思路。
var myString = "hello world";
List<string> list = new List();
int maxSize
while(index < myString.Length())
{
  if(index + maxSize > myString.Length())
  {
    // handle last case
    list.Add(myString.Substring(index));
    break;
  }
  else
  {
    list.Add(myString.Substring(index,maxSize));
    index+= maxSize;
   }
}

你仍然需要添加那个最后的小于75个字符的字符串 ;) - Nick Craver
抱歉,那就是//注释的作用。我只是有点懒 :) - Alan

1
当您说分割时,您是指分割函数吗?如果不是,那么可以尝试类似以下的操作:
List<string> list = new List<string>();
string s = "";
int num = 75;
while (s.Length > 0)
{
    list.Add(s.Substring(0, num));
    s = s.Remove(0, num);
}

0
    public static string SplitByLength(string s, int length)
    {
        ArrayList sArrReturn = new ArrayList();
        String[] sArr = s.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
        foreach (string sconcat in sArr)
        {
            if (((String.Join(" ", sArrReturn.ToArray()).Length + sconcat.Length)+1) < length)
                sArrReturn.Add(sconcat);
            else
                break;
        }
        return String.Join(" ", sArrReturn.ToArray());
    }

    public static string SplitByLengthOld(string s, int length)
    {
        try
        {
            string sret = string.Empty;
            String[] sArr = s.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
            foreach (string sconcat in sArr)
            {
                if ((sret.Length + sconcat.Length + 1) < length)
                    sret = string.Format("{0}{1}{2}", sret, string.IsNullOrEmpty(sret) ? string.Empty : " ", sconcat);
            }
            return sret;
        }
        catch
        {
            return string.Empty;
        }
    }

嗨 @Sankarann,SplitByLength 可用于 .NET 4.0+,而 SplitByLengthOld 则适用于所有类型的 .NET 框架。 - Lorenz

0

我假设可能有一个分隔符 - 比如空格字符。

在字符串(instr)上搜索,直到找到下一个分隔符的位置。

如果它小于你的子字符串长度(75),则将其附加到当前子字符串。

如果不是,则开始一个新的子字符串。

特殊情况 - 如果整个子字符串中没有分隔符 - 那么您需要定义发生什么 - 比如添加一个“-”然后继续。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接