2016-03-14 5 views
-4

Est-il possible d'avoir deux ou plusieurs indexeurs (ou quelque chose de simillar) avec la même signature?Avoir plusieurs indexeurs avec la même signature

Il ressemblerait à quelque chose comme ça

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

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

Cela donne une erreur parce que les deux méthodes sont sans nom et avec la même signature. Donc, est-il possible de nommer ces méthodes, mais gardez l'abilité de définir une valeur. à savoir

C.FirstCol(2) = 3; //Same as C.X[2,0] = 3 
C.SecondCol(5) = 4; //Same as C.X[5,1] = 4 

EDIT: Je vais essayer de l'expliquer mieux:

La ligne C.SetX(value) peut être modifiée à l'aide des propriétés C.X = value.

La ligne C.Set(num, value) peut être changé pour C[num] = value en utilisant indexeur

Ce que je vous demande comment puis-je changer ces lignes

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

À

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

Ou

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

Sans avoir A ou B comme tableaux

+1

S'ils ont la même signature comment le compilateur savoir lequel vous voulez appeler? – Sean

+0

Non, je ne pense pas que vous pouvez même avoir byte et int car il y a implicitement cast – Paparazzi

Répondre

0

Ce n'est pas possible - comment le compilateur peut-il savoir quel indexeur utiliser? Et il n'y a pas de syntaxe comme vous voudriez avoir dans votre échantillon.

Vous pouvez introduire la méthode comme ceci:

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

et similaire pour une deuxième colonne, etc. Mais pour être honnête, je ne vois pas le point. Peut-être qu'il serait préférable d'introduire l'indexeur bidimensionnel à la place?

+0

Pour savoir quel indexeur utiliser - c'est pourquoi j'ai demandé s'il est possible d'utiliser une méthode (avec un nom) comme un 'set', comme 'C.FirstRow (2) = 3;'. Et je sais que dans cet exemple il vaudrait mieux utiliser un indexeur à deux arguments, mais c'était juste un exemple pour montrer ce que je cherche – RexMan85

0

Vous pouvez créer une enveloppe d'index:

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

Et puis utilisez dans votre code:

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

Maintenant, vous pouvez dire:

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

Cette réponse vise à être démonstratif, mais pas nécessairement pratique. Si vous définissez une classe comme ceci:

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

Vous pouvez l'utiliser comme ceci:

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

Ce qui vous permettra de le faire:

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

Cependant, je ne conseillerais pas Ce faisant! Il serait beaucoup plus simple de simplement avoir une méthode Set(int i, int j, int value) ou un indexeur int this[int i, int j].

1

Vous pouvez utiliser un indexeur en deux dimensions (si je comprends bien votre problème!):

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

} 

occasion comme:

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