【问题标题】:How to make jagged indexer如何制作锯齿状索引器
【发布时间】:2013-10-18 04:15:44
【问题描述】:

我在某处看到过锯齿状的索引器,想知道如何让它们工作。

我知道我可以做到以下几点:

class foo
{
    public string this[int i1]
    {
        get{ return GetString(i1); }
    }

    public string this[int i1, int i2]
    {
        get{ return GetString(i1) + GetString(i2); }
    }
}

这样:

string s1 = foo[5];
string s2 = foo[12,8];

问题是,我如何定义索引器来做...

string s2 = foo[12][8];

如果可能(否则不清楚),我也会感谢 setter 定义。

foo[12][8] = "qwerty";

【问题讨论】:

  • 正如 ItzWarty 所说,只需从第一个索引器返回一个索引实例(可以是数组或嵌套类)。

标签: c# indexer


【解决方案1】:

Derrick Shepard 的回答似乎是正确的,但我有几点要告诉你:

使用您当前的方法:

public string this[int i1]
public string this[int i1, int i2]

foo[12][8] 将等效地解析为(foo[12])[8];你会得到string foo[12],然后得到它的第9个字符。

如果您愿意更改您的第一个方法(带有单个参数的索引器),您可以考虑返回一个对象,该对象反过来会提供另一个索引器。

【讨论】:

  • 评估很有帮助,但我不知道如何实施。是否可以同时拥有两个索引器,以便以下两个都有效:string s1 = foo[5];string s2 = foo[12][8];
  • 有一些方法可以通过从索引器对象到字符串的隐式转换来实现,但我认为大多数人会认为这是非常规的......而且真的很奇怪。 IMO 它会损害您代码的可读性而几乎没有什么好处。
【解决方案2】:

我希望这是您正在寻找的:

class foo
{
    private string[][] collection = new string[2][];

    public string[] this[int index]
    {
        get
        { 
            return collection[index]; 
        }
        set
        {
            collection[index] = value;
        }
    }
}

然后:

string s1 = foo[1][0];
foo[1][0] = s1;

当我创建它时我很高兴,但对我个人而言却很困惑,因为 getter 和 setter 很奇怪。看起来如果集合是一维数组而不是锯齿状的。

【讨论】:

    猜你喜欢
    • 2023-03-27
    • 2021-11-07
    • 1970-01-01
    • 2015-05-14
    • 1970-01-01
    • 1970-01-01
    • 2023-01-10
    • 1970-01-01
    • 2015-06-01
    相关资源
    最近更新 更多