C#取字符串的子字符串

C#取字符串的子字符串,c#,string,substring,C#,String,Substring,只有当文件没有特定的模式时,我才从文件中选取一行。。我想从那一行中取最后3个字符。。。我的代码是: while (!line.Contains(pattern)) { String num = line.Substring((line.Length - 3), (line.Length - 2)); System.Console.WriteLine(num); } 但是我犯了一个错误 索引和长度

只有当文件没有特定的模式时,我才从文件中选取一行。。我想从那一行中取最后3个字符。。。我的代码是:

        while (!line.Contains(pattern))
        {
             String num = line.Substring((line.Length - 3), (line.Length - 2));
             System.Console.WriteLine(num);
        }
但是我犯了一个错误

索引和长度必须引用字符串中的位置。 参数名称:长度


为什么我会这样?我在行尾前3个字符开始新字符串,在..之前停止2个字符:\

子字符串采用偏移量,然后返回若干字符:

因此:

当然,这是假设line.Length>3。您可以通过以下方式进行检查:

String num = (line.Length < 3) ? line : line.Substring((line.Length - 3), 3);
String num=(line.Length<3)?line:line.Substring((line.Length-3),3);

发生这种情况是因为Substring()的最后一个参数应该是要提取的字符串的长度

你的情况应该是3

,而不是
line.Length-2

第一个参数也应为:


line.Length-3

子字符串的第二个参数是从第一个参数开始必须接受的字符数。应该是这样的:
String num=line.Substring(line.Length-3,3)

这很危险。如果线的长度小于3怎么办?您可能应该选中此项,否则将出现异常

此外,还应使用子字符串方法,如图所示:


问题是您试图获得比数组更多的字符

扩展最适合解决像这样的问题;)我的名字有些脏,但每个人都知道它会做什么-这是异常安全的子字符串:

public static string SubstringNoLongerThenSource(this string source, int startIndex, int maxLength)
{
    return source.Substring(startIndex, Math.Min(source.Length - startIndex, maxLength));
}
所以你的问题应该是这样的:

String num = line.SubstringNoLongerThenSource((line.Length - 3), 3);
System.Console.WriteLine(num);

因此,如果您为函数提供的字符串有足够的字母,num将最多有3个字母:)

假定您的字符串长度小于3个字符。在前面开始3个字符,在前面停止2个字符将生成1个字符。你想要3个字符还是1个字符?你的行有多长?如果你不检查子字符串之前的长度,你肯定会造成问题。我不知道行的长度,因为它不是所有的时间都一样。。。我只想要最后3个字符…只是把它扔掉,但可能有一种巧妙的正则表达式方法,可以一次解析所有行,并匹配每行上的最后3个字符。+1-这个Q总是会吸引大量的答案,但你先得到;-)其他一些答案似乎认为应该从长度中减去4,这显然是不正确的。数组的索引从0开始,因此没有索引为
行的字符。长度
@rotman,请考虑长度为3的字符串。如果我取长度-3,那么我得到的第一个字符是零。@rotman:你能给我一个这个代码失败的例子吗?是的,在我写答案的时候,我几乎键入了
-4
,实际上我不得不在纸上画出数组以确保我是正确的:)@AdamRalph:这是一个措辞精巧、见解深刻的评论啊,老的没意见的回答编辑。所以现在我必须对我的评论进行评论,这样我才不会看起来像个白痴。谢谢你把-4改成-3。我又错了。抱歉,伙计,我得记住这一点。解释你的代码片段会更有帮助。如果你只指定子字符串的起始位置,子字符串将作为一个整体放在它后面。因为这个案例后面必须跟最后三个字母,(长度-3)就足以说明了。你是对的,不知道我为什么这么说。我已经编辑了我的答案。
String num = line.Substring(line.Length - 3)
public static string SubstringNoLongerThenSource(this string source, int startIndex, int maxLength)
{
    return source.Substring(startIndex, Math.Min(source.Length - startIndex, maxLength));
}
String num = line.SubstringNoLongerThenSource((line.Length - 3), 3);
System.Console.WriteLine(num);