Как переопределить функции из класса String в C # - PullRequest
5 голосов
/ 29 июня 2010

Например, мне нужно посмотреть, содержит ли строка подстроку, поэтому я просто делаю:

String helloworld = "Hello World";
if(helloworld.Contains("ello"){
    //do something
}

но если у меня есть массив элементов

String helloworld = "Hello World";
String items = { "He", "el", "lo" };

Мне нужно было создать функцию внутри класса String, которая бы возвращала true, если любой из элементы внутри массива содержатся в строке, например.

Я бы хотел переопределить функцию Contains (string) с помощью Contains (IEnumerable) для этого сценария вместо создания функции в другом классе. Возможно ли это сделать, и если да, то как мы можем переопределить функцию? Большое спасибо.

Итак, полное решение (спасибо, ребята):

public static bool ContainsAny(this string thisString, params string[] str) {
    return str.Any(a => thisString.Contains(a));
}

Ответы [ 2 ]

17 голосов
/ 29 июня 2010

Вы не можете переопределить функцию, но вы можете сделать метод расширения для этого:

public static class StringExtensions {
     public static bool ContainsAny(this string theString, IEnumerable<string> items)
     {
         // Add your logic
     }
}

Затем вы бы вызвали это так же, как обычный метод в строкепри условии, что вы ссылаетесь на сборку и включаете пространство имен:

String helloworld = "Hello World";
String[] items = new string[] { "He", "el", "lo" };

if (helloworld.ContainsAny(items)) { 
   // Do something
}

(Конечно, вы могли бы назвать это «Содержит», как стандартный метод строки, но я бы предпочел дать ему более явное имя, чтобы оноочевидно, что вы проверяете ...)

4 голосов
/ 29 июня 2010

Почему бы не упростить задачу и не использовать Any метод расширения ?

string helloworld = "Hello World";
string[] items = { "He", "el", "lo" };
if (items.Any(item => helloworld.Contains(item)))
{
    // do something
}
...