2009-05-09 23 views
59

Como programador que no sea .net, estoy buscando el equivalente .net de la antigua función vb left(string, length). Era flojo porque funcionaba con cualquier cadena de longitud. Como se esperaba, left("foobar", 3) = "foo" mientras, más útilmente, left("f", 3) = "f"..Net equivalente de la antigua función vb left (string, length)?

En .net string.Substring(index, length) arroja excepciones para todo lo que esté fuera de rango. En Java siempre tuve a mano lang.StringUtils de Apache-Commons. En Google, no llego muy lejos en la búsqueda de funciones de cadenas.

Editar:

@Noldorin - Vaya, gracias por sus extensiones vb.net! Mi primer encuentro, aunque me llevó 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 palabra clave this. Sí, son tan simples de invocar como "foobar".Left(3). Vea también c# extensions on msdn.

+0

encantados de haber introducido a ellos. :) Son funciones muy útiles tanto de VB.NET como de C# (siempre que sepa cómo usarlas de forma adecuada), y las encontrará útiles todo el tiempo. Por cierto, no estoy seguro si se dio cuenta, pero la función Math.Min es parte del BCL, así que también podría usarlo en C#. – Noldorin

+0

@Nolderin - Muy limpio, editado para reflejar el comentario de Math.Min. ¡Gracias! – Josh

+1

Como nota al pie, devuelve una nueva cadena (str.Take (length) .ToArray()); también funciona Me imagino que usar una subcadena es probablemente más rápido. – Sean

Respuesta

48

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 puede usarlo al igual que la antigua función VB Left (es decir Left("foobar", 3)) o el uso de la sintaxis VB.NET más reciente, es decir

Dim foo = "f".Left(3) ' foo = "f" 
Dim bar = "bar123".Left(3) ' bar = "bar" 
+0

Estaba simplemente escribiendo un ejemplo de un método de extensión. – j0tt

+0

Por lo que yo sé, los métodos de extensión no funcionan para VB.NET – Oded

+1

@Oded: Lo más seguro hacer en VB.NET 9. Es necesario especificar el atributo de extensión, que es muy diferente al método para C#. Ver http://msdn.microsoft.com/en-us/library/bb384936.aspx – Noldorin

1

Puede envolver la llamada a subcadena en una nueva función que pruebe la longitud como se sugiere en otras respuestas (la forma correcta) o use el espacio de nombres Microsoft.VisualBasic y use directamente a la izquierda (generalmente se considera de manera incorrecta!)

+0

No use Try ... Catch para detectar algo que se puede comprobar muy fácilmente para antemano. – Guffa

+0

Sí, tienes razón y lo edité exactamente el mismo tiempo que su comentario ... – RobS

+0

¿Por qué se utiliza el espacio de nombres VisualBasic considerado el "camino equivocado"? Es precisamente por eso que está incluido. Es parte de VB. –

5

usted podría hacer su propia

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

edición: el mío es en C#, tendrá que cambiar para vb

29

Otra opción una línea sería algo así como el siguiente:

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

Where myString es la cadena con la que está tratando de trabajar.

+0

Esta fue la primera solución que se me vino a la mente. Pensé que debe haber un camino más fácil/incorporado. Pero no hay ninguno ... –

+0

Estaba esperando esta respuesta. Gracias amigo. – Hari

30

Agregue una referencia a la biblioteca Microsoft.VisualBasic y puede usar el Strings.Left que es exactamente el mismo método.

+1

Solución mucho más simple: ¿para qué sirve reinventar la rueda? – Billious

+0

¿Qué pasa si quiero deshacerme por completo de las referencias de VB en mi aplicación .Net? – Hari

+4

Esto es como usar un tenedor para remover la sopa cuando no puedes encontrar la cuchara. –

11

no se olvide el caso nulo

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)); 
    } 
+0

Creo que 'count <= 0 'sería más claro que' count <1'. –

1

Otra técnica es extender el objeto de cadena mediante la adición de un método izquierda().

Aquí está el artículo fuente de esta técnica:

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

Aquí es mi aplicación (en VB):

StringExtensions Módulo

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

Módulo Fin

Luego pon esto en la parte superior de un archivo ny en la que desea utilizar la extensión:

Imports MyProjectName.StringExtensions 

utilizar de esta manera:

MyVar = MyString.Left(30) 
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 quieres arrastra o espacios iniciales, entonces no tiene suerte.

me gusta mucho el uso de Math.min, que parece ser una solución mejor.

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 haber error, devuelve nulos como cadena vacía, devuelve los valores recortados o base. Úselo como "testx". Izquierda (4) o str.Right (12);

0

apenas en caso muy especial:

Si usted está haciendo esto dejó tan entonces usted comprobar los datos con alguna cadena parcial, por ejemplo: if(Strings.Left(str, 1)=="*") ...;

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