none
Substring dando exceção RRS feed

  • Pergunta

  • To com uma exceção que nao to conseguindo resolver

    é um código simples para que uma Label não ultrapasse o espaço dela no UI

    mas quando compilo o programa, ele da essa exceção

    Index and length must refer to a location within the string.
    Parameter name: length

    esse é o código

    if (Texto.Length > 20)
                            {
                                index.Status = "Checking File: " +  ". . ." + Texto.Substring(15, Texto.Length);
                                Thread.Sleep(4000);
                            }

    e ja troquei para valores aleatórios, e alguns funcionam outros nao

    por exemplo

    Substring(15,20) funciona, mas (16,20) da erro... o.O




    • Editado Yuri Schmitz sábado, 16 de fevereiro de 2013 18:20
    sábado, 16 de fevereiro de 2013 18:03

Respostas

  • É uma lógica simples mais difícil de explicar. rsrs

    No substring primeiro parâmetro e o inicio onde ele vai começar a ler. Então posição 5. No segundo parâmetro quantas posição ele vai ler a parti da posição 5(primeiro parâmetro). A string tem o tamanho de 10. Então se ele já esta na posição 5, ai 10 - 5(texto.Length-5) ele tem que tirar as cincos primeiras posições.

    Console.WriteLine(texto.SubString(5, texto.Length-5)
    // Ficaria assim   (5, 10 - 5) mesma coisa que (5,5) 
    // 10 = tamanho da string 
    // -5 é para tirar as cincos primeiras posições
    Espero que pode ser um pouco mais claro.

    terça-feira, 19 de fevereiro de 2013 20:24
    Moderador

Todas as Respostas

  • Olá Yuri,

    Você quer pegar os últimos caracteres?

    string texto = "Pegar os ultimos caracteres com substring";
                if (texto.Length > 20)
                {
                    string str = texto.Substring(15, texto.Length - 15);
                }
    domingo, 17 de fevereiro de 2013 00:16
    Moderador
  • Valeu cara

    mas não entendi a lógica....

    quando colocamos (15, x) o texto diminui 15 caracteres ?

    porque achava que o texto.Length não modificava...

    segunda-feira, 18 de fevereiro de 2013 11:53
  • texto.Length não modifica, ele pega o número de caracteres da sua string.

    Comentando o código do Wellington para você entender:

    string texto = "Pegar os ultimos caracteres com substring";
    //Essa linha verifica se a string é maior que 20 caracteres 
    if (texto.Length > 20)
         {
    //essa linha cria uma nova string pegando do 15 campo da string até o a posição do fim da string - 15 caractere
             string str = texto.Substring(15, texto.Length - 15);
         }


    Twitter: @MayogaX
    Blog: Dev Blog

    • Sugerido como Resposta Afonso Fernandes segunda-feira, 18 de fevereiro de 2013 15:03
    segunda-feira, 18 de fevereiro de 2013 12:53
  • Então, mas eu não estou intendendo por que "texto.Length - 15" é o fim, porque pra mim  "texto.Length" era o fim da string...

    por exemplo

    string texto = "1234567890";
    
    Console.WriteLine(texto.Length);
    //o resultado será 10 né?
    // entao se eu quiser pegar uma certa parte da string até o final eu teria que fazer
    
    Console.WriteLine(texto.Substring(5, texto.Length); // (5 , 10)
    //mas se fizer isso vai da erro, o compilador ta intendendo como se fosse (5, 10+5) entao teria que fazer
    
    Console.WriteLine(texto.SubString(5, texto.Length-5)
    // O Compilador vai intender como (5, 10+5-5)
    
    // só nao to intendendo porque isso acontece!


    resumindo, em java se eu quiser pegar apenas o "890"

    fica assim:

    texto.substring(8, texto.length());

    em C# fica:

    texto.Substring(9, texto.Length - 9)

    Porque esse "-9"


    • Editado Yuri Schmitz terça-feira, 19 de fevereiro de 2013 19:57
    terça-feira, 19 de fevereiro de 2013 19:46
  • É uma lógica simples mais difícil de explicar. rsrs

    No substring primeiro parâmetro e o inicio onde ele vai começar a ler. Então posição 5. No segundo parâmetro quantas posição ele vai ler a parti da posição 5(primeiro parâmetro). A string tem o tamanho de 10. Então se ele já esta na posição 5, ai 10 - 5(texto.Length-5) ele tem que tirar as cincos primeiras posições.

    Console.WriteLine(texto.SubString(5, texto.Length-5)
    // Ficaria assim   (5, 10 - 5) mesma coisa que (5,5) 
    // 10 = tamanho da string 
    // -5 é para tirar as cincos primeiras posições
    Espero que pode ser um pouco mais claro.

    terça-feira, 19 de fevereiro de 2013 20:24
    Moderador
  • Valeu cara, deu pra intender sim, ficou meio que na decoreba, porque em java não lembro de ter o -5, acredito que seja mais normal, trazendo para uma situação real, onde alguem fala

    "Olha quero que você pegue essa estrada no KM 10 até o final dela (km 30)

    o raciocínio do cara é só sair da estrada quando ele ver a placa de valor "KM 30" e não KM 30 - 10

    Consegue intender, acredito que fique muito melhor, mas fazer o que né? :p

    é como se o primeiro parâmetro fosse o inicio, e o segundo quanto ele vai percorrer e não o final

    então você falaria

    "Olha quero que voce pegue essa estrada no KM 10 e so saia quando percorrer 20 KM"

    • Editado Yuri Schmitz segunda-feira, 4 de março de 2013 14:51
    segunda-feira, 4 de março de 2013 14:49