我想用`[]`检查一个字符串是否存在于数组中

时间:2016-08-25 09:24:51

标签: c#

目前我的代码就像那样

public class ExampleClass
{
    private static string[] words = new string[] { "Word1","Word2","Word3","Word4","Word5" };

    public static bool IsExist(string Word)
    {
        return words.Any(w => w == Word);
    }
}

我称之为

ExampleClass.IsExist("Word1"); //Returns true
ExampleClass.IsExist("WordNotExist"); //Returns false

但我想这样打电话

ExampleClass.IsExist["Word1"]; //Returns true
ExampleClass.IsExist["WordNotExist"]; //Returns false

我应该如何修改我的课程,请帮助我

4 个答案:

答案 0 :(得分:4)

我认为你在这里真的很糟糕,因为使用索引器调用方法是错误的。有了它,你就不能在静态类上拥有索引器。

那说,这就是它的工作原理:

public class ExampleClass
{
    public class IsExistHelper
    {
        private static string[] words = new string[] { "Word1", "Word2", "Word3", "Word4", "Word5" };

        public bool this[string Word]
        {
            get
            {
                return words.Any(w => w == Word);
            }
        }
    }

    public static IsExistHelper IsExist { get; } = new IsExistHelper();
}

我使用内部类创建了一个帮助器,它创建了你的属性名。里面有一个索引器,它有原始代码。

答案 1 :(得分:1)

不确定为什么你会这样做,但是:

public class ExampleClass
{
    private string[] words = new string[] { "Word1", "Word2", "Word3", "Word4", "Word5" };

    public bool this[string Word]
    {
        get { return words.Any(w => w == Word); }
    }
}

必须使用实例调用它:

var _ = new ExampleClass();
var isTrue = _["Word1"] == true

很遗憾,您无法使用static成员进行此操作。或者,您需要在辅助类中创建一个索引器,其实例名称为IsExist

我的意见是你应该保持原样。

答案 2 :(得分:1)

要完全按照你想要的方式实现它(尽管在我看来这不是一个好的设计)使用一个内部类来覆盖[]运算符并检查你的状况。然后在你的原始类中有一个内部类的属性。

请注意,覆盖[]运算符时,您无法使用静态类。

请注意,您可以使用Any而不是Contains,因为您正在检查整个对象本身,这是一种更简洁的方法

public static class ExampleClass
{

    public class InnerIsExist
    {
        private string[] words = new string[] { "Word1", "Word2", "Word3", "Word4", "Word5" };

        public bool this[string word]
        {
            get {  return words.Contains(word); }
        }
    }

    public static InnerIsExist IsExist { get; } = new IsExistClass();
}

使用:

var doesItContain = ExampleClass.IsExist["b"]; // false

答案 3 :(得分:1)

目前,您正在调用一个函数,它就像声明它一样简单,但对于方括号,您将不得不重载它们。这是一个有用的链接:How do I overload the square-bracket operator in C#?

基本上,在你的情况下它应该是这样的:

public bool this[string Word]
{
    get { return words.Any(w => w==Word); }
}

我还没有对代码进行测试,请告诉我它是否有效。