拥有多个具有相同签名的Indexer

时间:2016-03-14 17:24:35

标签: c# .net methods indexer

是否有可能有两个或更多具有相同签名的索引器(或类似的东西)?

所以它看起来像这样

    private int[,] X;
    public int this[int a]
    {
        set
        {
            X[a, 0] = value;
        }

    }
    public int this[int a]
    {
        set
        {
            X[a, 1] = value;
        }
    }

这会产生错误,因为这两种方法都是无名的并且具有相同的签名。因此可以命名这些方法,但保持设置值的能力。即。

C.FirstCol(2) = 3; //Same as C.X[2,0] = 3
C.SecondCol(5) = 4; //Same as C.X[5,1] = 4
编辑:我会尝试更好地解释它:

可以使用属性将行C.SetX(value)更改为C.X = value

可以使用索引器

将行C.Set(num, value)更改为C[num] = value

我要问的是如何更改这些行

C.SetA(num, value)
C.SetB(num, value)

C.A[num] = value
C.B[num] = value

或者

C.A(num) = value
C.B(num) = value

没有A或B作为数组

4 个答案:

答案 0 :(得分:1)

您可以使用二维索引器(如果我正确理解您的问题!):

private int[,] X;
public int this[int row, int column]
{
    set
    {
        X[row, column] = value;
    }

}

用过:

C[2, 0] = 3;
C[5, 1] = 4;

答案 1 :(得分:0)

这是不可能的 - 编译器如何知道您要使用哪个索引器?并且您的样本中没有您想要的语法。

你可以这样介绍一下这个方法:

public void FirstCol(int rowIndex, int value)
{
    X[rowIndex, 0] = value;
}

和类似的第二列等等。但老实说,我看不出重点。也许最好引入二维索引器呢?

答案 2 :(得分:0)

您可以创建索引包装器:

class Indexer
{
  private int[,] data;
  private int index;

  public Indexer(int index, int[,] data)
  {
    this.index = index;
    this.data = data;
  }

  public int this[int a]
  {
    set {data[a,index] = value;}
  }
}

然后在您的代码中使用它:

class Foo
{
  private int[,] data;
  private readonly Indexer first;
  private readonly Indexer second;

  public Foo()
  {
    first = new Indexer(0, data);
    second = new Indexer(1, data);
  }

  public Indexer First
  {
    get{ return first;}
  }

  public Indexer Second
  {
    get{ return second;}
  }
}

现在你可以说:

Foo f = new Foo();
f.First[2] = 3;
f.Second[5] = 4;

答案 3 :(得分:0)

这个答案是示范性的,但不一定是实用的。如果您定义这样的类:

class Indexer<TKey, TValue>
{
    Func<TKey, TValue> getter;
    Action<TKey, TValue> setter;
    public Indexer(Func<TKey, TValue> getter, Action<TKey, TValue> setter)
    {
        this.getter = getter;
        this.setter = setter;
    }
    public TValue this[TKey key]
    {
        get { return getter(key); }
        set { setter(key, value); }
    }
}

您可以像这样使用它:

Indexer<int, int> firstColumn = new Indexer<int, int>(
    i => X[i, 0],
    (i, v) => X[i, 0] = v);
public Indexer<int, int> FirstColumn
{
    get { return firstColumn; }
}

Indexer<int, int> secondColumn = new Indexer<int, int>(
    i => X[i, 1],
    (i, v) => X[i, 1] = v);
public Indexer<int, int> SecondColumn
{
    get { return secondColumn; }
}

然后你可以这样做:

C.FirstColumn[2] = 3;
C.SecondColumn[4] = 5;

但是,我不建议这样做!简单地使用方法Set(int i, int j, int value)或索引器int this[int i, int j]会更直接。