Como un no .net programador que estoy buscando .neto equivalente al antiguo vb función left(string, length). Era perezoso en que se trabajó para cualquier longitud de la cadena. Como era de esperar, left("foobar", 3) = "foo" mientras, la mayoría de utilidad, left("f", 3) = "f".

En .net string.Substring(index, length) lanza excepciones para todo, fuera de rango. En Java siempre he tenido el Apache Commons lang.StringUtils a mano. En Google no lo entiendo muy lejos de la búsqueda para funciones de cadena.

Edición:

@Noldorin – Wow, gracias por su vb.net las extensiones! Mi primer encuentro, aunque me tomó varios segundos para hacer lo mismo en c#:

public static class Utils
{
    public static string Left(this string str, int length)
    {
        return str.Substring(0, Math.Min(length, str.Length));
    }
}

Nota la clase estática y método, así como la this palabra clave. Sí, son así de sencillo invocar como "foobar".Left(3). Véase también c# extensiones en msdn.

  • Me alegro de que se han introducido a ellos. 🙂 Son muy útiles las características de ambos VB.NET y C# (siempre y cuando usted sabe cómo usarlos lógicamente), y te encontrarás con ellos en la mano todo el tiempo. Por cierto, no se si te diste cuenta, pero las Matemáticas.Min función es parte de la BCL, así que podrías usar en C# también.
  • Muy cuidada, editado para reflejar las Matemáticas.Min comentario. Gracias!
  • Como una nota a pie de página, return new string( str.Tomar( longitud ).ToArray() ); también funciona. Me imagino que con la subcadena es probablemente más rápido.
  • También se puede utilizar return str.Length > length ? str.Remove(length) : str;
  • De otra manera: return string.Concat(str.Take(length));
InformationsquelleAutor Josh | 2009-05-09

11 Comentarios

  1. 52

    He aquí un método de extensión que va a hacer el trabajo.

    <System.Runtime.CompilerServices.Extension()> _
    Public Function Left(ByVal str As String, ByVal length As Integer) As String
        Return str.Substring(0, Math.Min(str.Length, length))
    End Function

    Esto significa que usted puede utilizar exactamente igual que el viejo VB Left función (es decir,Left("foobar", 3) ) o el uso de las nuevas VB.NET la sintaxis, es decir,

    Dim foo = "f".Left(3) ' foo = "f"
    Dim bar = "bar123".Left(3) ' bar = "bar"
    • Se acaba de escribir un ejemplo de un método de extensión.
    • Hasta donde yo sé, los métodos de extensión no funcionan para VB.NET
    • Que la mayoría no duda en VB.NET 9. Debe especificar el atributo de Extensión, que es muy diferente al método de C#. Consulte msdn.microsoft.com/en-us/library/bb384936.aspx
    • La pregunta original se dijo nada acerca de un método de extensión. Parece estar saliéndose por la tangente.
    • Robinson: No realmente, creo. Sólo porque él no lo menciona, no quiere decir que no sea válido (además de la respuesta. De hecho, porque él no se refieren a ella, yo sospechaba que era probable que sea de más de interés para él. Agregar información adicional que podría ser de ayuda nunca está de más. 🙂
    • La fijación de algunos legado código de vino en la mano.

  2. 33

    Otra opción de la línea sería algo como lo siguiente:

    myString.Substring(0, Math.Min(length, myString.Length))

    Donde myString es la cadena que se quiere trabajar.

    • Esta fue la primera solución que vino a mi mente. Pensé que debe haber una manera más fácil/construir-en el camino. Pero no hay ninguno…
    • Yo esperaba esta respuesta. Gracias compañero.
  3. 31

    Agregar una referencia a Microsoft.VisualBasic biblioteca y usted puede utilizar el Las cadenas de caracteres.A la izquierda que es exactamente el mismo método.

    • Solución mucho más sencilla – ¿cuál es el punto de tener que reinventar la rueda?
    • Lo que si me quieren deshacerse por completo de VB referencias en mi .Neto de la aplicación ?
    • Esto es como usar un tenedor para revolver la sopa cuando usted no puede encontrar la cuchara.
    • mientras que su metáfora es colorido es mal aplicada. El OP pidió el VB de la función y esto es exactamente lo que él pidió.
    • Es sólo la adición de otra biblioteca de funciones para ahorrar tiempo. Usted puede cubrir tus ojos cuando ves el «VB» si te hace sentir mejor.
    • La adición de 4 o más líneas de código para hacer lo que una línea puede es como hacer gárgaras con mantequilla de maní para saciar su sed.

  4. 13

    no olvides el nulo caso

      public static string Left(this string str, int count)
        {
            if (string.IsNullOrEmpty(str) || count < 1) 
                return string.Empty;
            else
                return str.Substring(0,Math.Min(count, str.Length));
        }
    • Creo que count <= 0 sería más claro que count < 1.
  5. 5

    podría hacer su propio

    private string left(string inString, int inInt)
    {
        if (inInt > inString.Length)
            inInt = inString.Length;
        return inString.Substring(0, inInt);
    }

    edit: la mía es en C#, usted tendrá que cambiar para vb

  6. 5
    using System;
    
    public static class DataTypeExtensions
    {
        #region Methods
    
        public static string Left(this string str, int length)
        {
            str = (str ?? string.Empty);
            return str.Substring(0, Math.Min(length, str.Length));
        }
    
        public static string Right(this string str, int length)
        {
            str = (str ?? string.Empty);
            return (str.Length >= length)
                ? str.Substring(str.Length - length, length)
                : str;
        }
    
        #endregion
    }

    No debería de error, devuelve null como cadena vacía, devuelve recortados o valores de base. Utilizar como «testx».A la izquierda(4) o str.A la derecha(12);

  7. 2

    Puede envolver la llamada a la subcadena en una nueva función que comprueba la longitud de la misma, como se sugiere en otras respuestas (de la manera correcta) o usar el de Microsoft.VisualBasic espacio de nombres y el uso de la izquierda directamente (generalmente se considera el camino equivocado!)

    • Usted no debe usar Try…Catch para capturar algo que usted puede fácilmente comprobar de antemano.
    • Sí, tienes razón y he editado exactamente el mismo tiempo que tu comentario…
    • ¿Por qué usar el VisualBasic espacio de nombres considerado el «camino equivocado»? Esa es precisamente la razón por la que está incluido. Es parte de la VB.
    • No es «malo». Es simplemente extraño.
  8. 2

    Otra técnica es la de extender la cadena de objeto mediante la adición de una a la Izquierda() método.

    Aquí es la fuente artículo sobre esta técnica:

    http://msdn.microsoft.com/en-us/library/bb384936.aspx

    Aquí está mi aplicación (en VB):

    Módulo StringExtensions

    <Extension()>
    Public Function Left(ByVal aString As String, Length As Integer)
        Return aString.Substring(0, Math.Min(aString.Length, Length))
    End Function

    Final Del Módulo

    A continuación, poner esto en la parte superior de cualquier archivo en el que desea usar la extensión:

    Imports MyProjectName.StringExtensions

    Usarlo como este:

    MyVar = MyString.Left(30)
  9. 1

    Me gusta hacer algo como esto:

    string s = "hello how are you";
    s = s.PadRight(30).Substring(0,30).Trim(); //"hello how are you"
    s = s.PadRight(3).Substring(0,3).Trim(); //"hel"

    Aunque, si desea tirados o principio espacios, entonces estás de suerte.

    Me gusta mucho el uso de las Matemáticas.Min, parece ser una mejor solución.

  10. 0

    Sólo En Caso Muy Especial:

    Si usted está haciendo esto a la izquierda para, a continuación, usted podrá comprobar los datos con algunos parcial de cadena de caracteres, por ejemplo:
    if(Strings.Left(str, 1)=="*") ...;

    A continuación, también puede utilizar C# métodos de instancia como StartsWith y EndsWith para realizar estas tareas.
    if(str.StartsWith("*"))...;

  11. 0

    Si quieres evitar el uso de un método de extensión y prevenir una longitud de error, pruebe este

    string partial_string = text.Substring(0, Math.Min(15, text.Length)) 
    //example of 15 character max

Dejar respuesta

Please enter your comment!
Please enter your name here