【问题标题】:C# substring out of rangeC# 子字符串超出范围
【发布时间】:2016-05-18 19:40:05
【问题描述】:

我遇到的问题是我需要能够遍历一个字符串,在索引位置之后返回 5 个字符,然后在之后开始 5 个字符。

但是,当剩下的字符少于 5 个时,会发生超出范围的错误,我认为它只会打印字符串的剩余字符。

string string1 = "ghuitghtruighr";
for (int index = 0; index < string1.Length; index += 5)
{
    string subString = string1.Substring(i, 5);
    Console.WriteLine(subString);
}

当余数小于 5 时,如何让它打印字符串的余数?

【问题讨论】:

  • Per the docslength indicates a position not within this instance.时会抛出异常

标签: c# substring


【解决方案1】:

您可以像这样使用 LINQ .Skip(...).Take(...) 运算符:

for (int index = 0; index < string1.Length; index += 5)
{
    string subString = new String(string1.Skip(index).Take(5).ToArray());
    Console.WriteLine(subString);
}

这给了:

吉特 格特鲁 高

【讨论】:

    【解决方案2】:

    将 OP 代码的第 3 行替换为:

    string subString = string1.Substring(i, string1.Length - i &lt; 5 ? string1.Length - i : 5);

    【讨论】:

    • 虽然正确,但您的答案需要一些解释性文字。为什么它有效?它解决了什么问题?这个问题的原因是什么?单行代码的答案是不透明的。
    【解决方案3】:

    您可以Substring()从索引到字符串的末尾,然后检查生成的子字符串是否包含超过5个字符:

    string string1 = "ghuitghtruighr";
    for (int index = 0; index < string1.Length; index += 5)
    {
        string subString = string1.Substring(index);
        if(subString.Length > 5)
            subString = subString.Substring(0, 5);
        Console.WriteLine(subString);
    }
    

    如果您有许多不同的长度很长的字符串,请不要执行上述操作 - strings 是不可变的,因此在每次迭代中调用 Substring() 两次会导致每次在堆上都有一个额外的字符串 - 而不是 calculate the difference between Length and index like suggested by Xerillio

    【讨论】:

      猜你喜欢
      • 2012-06-23
      • 1970-01-01
      • 2020-10-20
      • 1970-01-01
      • 2013-04-22
      • 2012-04-27
      • 2010-10-31
      • 2021-12-30
      • 1970-01-01
      相关资源
      最近更新 更多