2012-01-18 28 views
5

字符串的Contains(...)方法區分大小寫。我想重寫它,以使其不區分大小寫用下面的代碼(這是從here被盜):如何覆蓋Contains()?

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

不過,我不知道在哪裏的代碼應粘貼。它應該放在類程序的同一個命名空間中嗎?它需要一個專門的課程嗎?

+1

因爲它的密封不能從字符串類繼承。 – Jeb 2012-01-18 13:08:32

+3

@JohnParr是的,但問題的標題和文字有誤導性。他實際上使用了擴展方法--OP似乎並不真正瞭解或理解(還)。 – 2012-01-18 13:10:09

回答

8

如果您打算爲string類創建extension method,那麼您需要將它放入某個類中。要使用它,只需確保您有一個using語句指定對包含該類的命名空間的引用。

例如:

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

您需要將此擴展方法放置在對您有意義的地方,例如實用程序類,它必須是靜態的。你實際上不能從字符串中覆蓋任何東西,這就是爲什麼你要使用擴展方法。

例子:

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

糟糕,包含的類當然也需要是靜態的:-) – diggingforfire 2012-01-18 13:12:18

1

我建議把它在某種實用類的,你做,其中包含很好的輔助方法,如這一點。如果您將其添加到StringUtils課程中,則可以撥打StringUtils.Contains()來使用它。

+1

不完全是,他發佈的方法是擴展方法。所以他不需要CtringUtils.Contains他可以直接調用包含在他的字符串中。 – dowhilefor 2012-01-18 13:10:30

+0

@dowhilefor我主要是一個Java開發人員,所以你不得不原諒我;) – jprofitt 2012-01-18 13:14:22

2

當你創建一個擴展方法,你可以把它放到任何空間和任何靜態類:

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

這純粹是一個組織的事情。你將需要添加必要的using MyProject.MyNamespace;聲明,當然你永遠使用的代碼當然。

1

這是一個Extension Method。你可以創建一個名爲MyStringExtension的類。但這個名字並不真正相關。只要代碼文件具有已定義的名稱空間,MyStringExtension類定義在哪裏,則所有字符串都將具有該方法。

1

這種方法被稱爲Extension method

你可以把它在靜態類中的自定義命名空間,並使用您的自定義命名空間中使用它。

1

而不是重寫(你不能這麼做)或者創建一個擴展方法,我建議你使用下面的Contains重載並寫入自定義IEqualityComparer

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

你可能想改變「覆蓋擴展方法」(這也是不可能的,因爲它們實際上是靜態方法)爲「創建擴展方法」。包括我自己在內的人有點挑剔;-) – 2012-01-18 13:13:35

+0

完成並完成,先生:) – 2012-01-18 13:16:52

+1

「先生」可能是我的一天。 :-) – 2012-01-18 13:18:22

1

這是一個extension method,所以這將是可用的訪問您的擴展方法的任何字符串對象。

您可以定義它像這樣

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

而使用這樣

using Example.ExtensionMethods; 

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