如何覆盖Contains()方法?

6

Contains(...)方法区分大小写。我想使用以下代码覆盖它,使其不区分大小写(该代码从这里抄来):

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

然而,我不知道代码应该粘贴在哪里。它应该放在程序类的同一命名空间中吗?它需要一个专用类吗?


1
由于字符串类是密封的,因此您无法从它继承。 - Jeb
3
是的,但问题的标题和文字有误导性。实际上,他正在使用一个扩展方法——而问题提出者似乎并不真正了解或理解这个方法(尚未)。 - Christian.K
8个回答

10
如果您的目的是为 string 类创建一个扩展方法,那么您需要将其放置在某个类中。要使用它,只需确保您有一个包含此类的命名空间的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);

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

这是一个扩展方法。你可以创建一个名为MyStringExtension的类,但实际上名称并不重要。只要代码文件定义了命名空间,其中定义了MyStringExtension类,所有字符串都将具有该方法。


1

这个方法被称为扩展方法

你可以将它放在自定义命名空间的静态类中,并通过使用你的自定义命名空间来使用它。


1

你需要把这个扩展方法放在一个对你有意义的地方,例如一个必须是静态的实用类中。你实际上不能覆盖任何来自字符串的内容,这就是为什么要使用扩展方法。

示例:

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

哎呀,包含该类的类也需要是静态的 :-) - diggingforfire

1

不要覆盖(这是不可能的)或创建扩展方法,我建议您使用以下Contains重载,并编写自定义IEqualityComparer

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

你可能想把“覆盖扩展方法”(实际上它们是静态方法,所以不可能被覆盖)改为“创建一个扩展方法”。人们,包括我在内,都有点苛刻。;-) - Christian.K

1

这是一个扩展方法,因此它将在任何具有访问权限的字符串对象上可用。

你可以像这样定义它

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);

0

我建议将它放在某种实用类中,其中包含诸如此类的好用的帮助方法。如果你将它添加到,比如一个StringUtils类中,你只需要调用 StringUtils.Contains() 就可以使用它了。


2
不完全正确,他发布的方法是扩展方法。因此,他不需要CtringUtils.Contains,他可以直接在字符串上调用contains。 - dowhilefor
@dowhilefor 我主要是Java开发人员,所以请原谅我 ;) - jprofitt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接