2012-01-18 13 views
5

Il metodo Contains(...) per la stringa fa distinzione tra maiuscole e minuscole. Mi piacerebbe ignorare al fine di renderlo case-insensitive con il seguente codice (che è stato rubato da here):Come sovrascrivere Contains()?

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

Tuttavia, non so dove il codice deve essere incollato. Dovrebbe essere inserito nello stesso spazio dei nomi del programma di classe? Ha bisogno di una lezione dedicata?

+1

Non si può ereditare dalla classe string dal momento che è sigillato. – Jeb

+3

@JohnParr Sì, ma il titolo e il testo della domanda sono fuorvianti. In realtà sta usando un metodo di estensione - che l'OP non sembra davvero conoscere o comprendere (ancora). –

risposta

8

Se si intende creare un extension method per la classe string, è necessario inserirlo in una classe. Per usarlo, assicurati di avere un'istruzione using che specifica un riferimento allo spazio dei nomi che contiene la classe.

Ad esempio:

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

Avrete bisogno di mettere questo metodo di estensione da qualche parte dove ha senso per voi, per esempio una classe di utilità, che deve essere statica. Non puoi in realtà ignorare nulla dalla stringa, ecco perché stai utilizzando il metodo di estensione.

Esempio:

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

Oops, anche la classe contentente deve essere statica :-) – diggingforfire

1

vorrei suggerire di metterlo in una sorta di classe di utilità che si fanno, che contiene metodi helper bello come questo. Se lo hai aggiunto, ad esempio, a una classe StringUtils, puoi semplicemente chiamare StringUtils.Contains() per usarlo.

+1

Non esattamente, il metodo che ha pubblicato è un metodo di estensione. Quindi non avrebbe avuto bisogno dei CtringUtils.Contains che poteva chiamare direttamente contiene sulla sua stringa. – dowhilefor

+0

@dowhilefor Sono principalmente uno sviluppatore Java, quindi dovrai scusarmi;) – jprofitt

2

Come si sta creando un metodo di estensione, si può mettere in qualsiasi spazio dei nomi e qualsiasi classe statica:

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

Questo è puramente una cosa organizzativo. Dovrai aggiungere le necessarie dichiarazioni using MyProject.MyNamespace; dove mai utilizzi il codice, ovviamente.

1

Questo è un Extension Method. Potresti semplicemente creare una classe chiamata MyStringExtension. Ma il nome non è veramente rilevante. Finché il file di codice ha lo spazio dei nomi definito, dove è definita la tua classe MyStringExtension, tutte le stringhe avranno quel metodo.

1

Questo metodo viene chiamato Extension method

Si può avere nel vostro spazio personalizzato all'interno di classe statica e utilizzarlo utilizzando lo spazio dei nomi personalizzato.

1

Invece di eseguire l'override (che non è possibile eseguire) o la creazione di un metodo di estensione, suggerisco di utilizzare il seguente sovraccarico Contains e di scrivere invece IEqualityComparer personalizzato.

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

Potresti voler cambiare "metodo di sovrascrittura dell'estensione" (che non è nemmeno possibile in quanto sono metodi statici) in "creazione di un'estensione" metodo". Le persone, incluso me stesso, sono un po 'pignoli ;-) –

+0

Fatto e fatto, signore :) –

+1

Quel "signore" potrebbe essere il mio giorno. :-) –

1

Questo è un extension method, quindi sarà disponibile su qualsiasi oggetto stringa che ha accesso al vostro metodo di estensione.

Si potrebbe definire in questo modo

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

E utilizzare come questo

using Example.ExtensionMethods; 

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