2012-01-18 19 views
5

El método Contains(...) para la cadena distingue entre mayúsculas y minúsculas. Me gustaría anularlo con el fin de que sea sensible a las mayúsculas con el siguiente código (que es robado de here):Cómo anular contiene()?

public static bool Contains(this string source, string toCheck, StringComparison comp) 
{ 
    return source.IndexOf(toCheck, comp) >= 0; 
} 

Sin embargo, no sé en que el código debe ser pegada. ¿Debería colocarse dentro del mismo espacio de nombres del programa de la clase? ¿Necesita una clase dedicada?

+1

No se puede heredar de la clase string, ya que está sellada. – Jeb

+3

@JohnParr Sí, pero el título y el texto de la pregunta son engañosos. En realidad está usando un método de extensión, que el OP parece no saber realmente ni comprender (aún). –

Respuesta

8

Si lo que pretendes es crear un extension method para la clase string, entonces debes ponerlo dentro de alguna clase. Para usarlo, simplemente asegúrese de tener una declaración using especificando una referencia al espacio de nombres que contiene la clase.

Por ejemplo:

namespace SomeNamespace 
{ 
    public static class StringExtensions 
    { 
     public static bool Contains(this string source, string toCheck, StringComparison comp) 
     { 
      return source.IndexOf(toCheck, comp) >= 0; 
     } 
    } 
} 

// ... In some other class ... 
using SomeNamespace; 

// ... 
bool contains = "hello".Contains("ll", StringComparison.OrdinalIgnoreCase); 
1

Tendrá que poner este método de extensión en algún lugar donde tenga sentido para usted, por ejemplo, una clase de utilidad, que tiene que ser estática. En realidad, no puede anular nada de cadena, es por eso que está usando el método de extensión.

Ejemplo:

public static class StringExtension 
{ 
    public static bool Contains(this string source, string toCheck, StringComparison comp) 
    { 
     return source.IndexOf(toCheck, comp) >= 0; 
    } 
} 
+0

Vaya, la clase que contiene debe ser estática también, por supuesto :-) – diggingforfire

1

Yo sugeriría ponerlo en algún tipo de clase de utilidad que haga, que contiene métodos auxiliares agradables como este. Si lo agregó a, por ejemplo, una clase StringUtils, puede llamar al StringUtils.Contains() para usarlo.

+1

No exactamente, el método que publicó es un método de extensión. Así que no necesitaría CtringUtils.Contains que pudiera llamar directamente contiene en su cadena. – dowhilefor

+0

@dowhilefor Soy en su mayoría un desarrollador de Java, por lo que tendrá que disculparme;) – jprofitt

2

Mientras esté creando un método de extensión, se puede poner en cualquier espacio de nombres y cualquier clase estática:

namespace MyProject.MyNamespace 
{ 
    public static class MyExtensions 
    { 
     public static bool Contains(this string source, string toCheck, StringComparison comp) 
     { 
      return source.IndexOf(toCheck, comp) >= 0; 
     } 
    } 
} 

Esto es puramente una cosa organizacional. Necesitará agregar las declaraciones using MyProject.MyNamespace; necesarias siempre que use el código, por supuesto.

1

Esto es Extension Method. Podrías crear una clase llamada MyStringExtension. Pero el nombre no es realmente relevante. Siempre que el archivo de código tenga definido el espacio de nombres, donde se define su clase MyStringExtension, todas sus cadenas tendrán ese método.

1

Este método se llama Extension method

Puede tenerlo en su espacio de nombres personalizado dentro de la clase estática y utilizarla mediante el uso de su espacio de nombres personalizado.

1

En lugar de anular (lo que no puede hacer) o crear un método de extensión, le sugiero que utilice la siguiente sobrecarga Contains y escriba IEqualityComparer personalizado.

public static bool Contains<TSource>(
    this IEnumerable<TSource> source, 
    TSource value, 
    IEqualityComparer<TSource> comparer); 
+0

Es posible que desee cambiar "sobreescribir el método de extensión" (que tampoco es posible ya que son métodos estáticos realmente) en "crear una extensión método". La gente, incluyéndome a mí, son un poco quisquillosos ;-) –

+0

Hecho y hecho, señor :) –

+1

Ese "señor" podría ser mi día. :-) –

1

Eso es un extension method, por lo que estará disponible en cualquier objeto cadena que tiene acceso a su método de extensión.

Es posible definirlo como esto

namespace Example.ExtensionMethods 
{ 
    public static class StringExtensions 
    { 
     public static bool Contains(this string source, string toCheck, StringComparison comp) 
     { 
      return source.IndexOf(toCheck, comp) >= 0; 
     } 
    } 
} 

Y utilizar como esto

using Example.ExtensionMethods; 

string s = "foobar"; 
int i = s.Contains("oob", StringComparison.InvariantCultureIgnoreCase);